Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork387
Python Classes Without Boilerplate
License
python-attrs/attrs
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
attrs is the Python package that will bring back thejoy ofwriting classes by relieving you from the drudgery of implementing object protocols (akadunder methods).Trusted by NASA for Mars missions since 2020!
Its main goal is to help you to writeconcise andcorrect software without slowing down your code.
attrs would not be possible without ouramazing sponsors.Especially those generously supporting us at theThe Organization tier and higher:
Please considerjoining them to help makeattrs’s maintenance more sustainable!
attrs gives you a class decorator and a way to declaratively define the attributes on that class:
>>>from attrsimport asdict, define, make_class, Factory>>>@define...classSomeClass:... a_number:int=42... list_of_numbers: list[int]= Factory(list)......defhard_math(self,another_number):...returnself.a_number+sum(self.list_of_numbers)* another_number>>> sc= SomeClass(1, [1,2,3])>>> scSomeClass(a_number=1, list_of_numbers=[1, 2, 3])>>> sc.hard_math(3)19>>> sc== SomeClass(1, [1,2,3])True>>> sc!= SomeClass(2, [3,2,1])True>>> asdict(sc){'a_number': 1, 'list_of_numbers': [1, 2, 3]}>>> SomeClass()SomeClass(a_number=42, list_of_numbers=[])>>> C= make_class("C", ["a","b"])>>> C("foo","bar")C(a='foo', b='bar')
Afterdeclaring your attributes,attrs gives you:
- a concise and explicit overview of the class's attributes,
- a nice human-readable
__repr__
, - equality-checking methods,
- an initializer,
- and much more,
without writing dull boilerplate code again and again andwithout runtime performance penalties.
This example usesattrs's modern APIs that have been introduced in version 20.1.0, and theattrs package import name that has been added in version 21.3.0.The classic APIs (@attr.s
,attr.ib
, plus their serious-business aliases) and theattr
package import name will remainindefinitely.
Check outOn The Core API Names for an in-depth explanation!
No problem!Types are entirelyoptional withattrs.Simply assignattrs.field()
to the attributes instead of annotating them with types:
fromattrsimportdefine,field@defineclassSomeClass:a_number=field(default=42)list_of_numbers=field(factory=list)
On the tin,attrs might remind you ofdataclasses
(and indeed,dataclasses
are a descendant ofattrs).In practice it does a lot more and is more flexible.For instance, it allows you to definespecial handling of NumPy arrays for equality checks, allows more ways toplug into the initialization process, has a replacement for__init_subclass__
, and allows for stepping through the generated methods using a debugger.
For more details, please refer to ourcomparison page, but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice.
- Changelog
- Documentation
- PyPI
- Source Code
- Contributing
- Third-party Extensions
- Get Help: use the
python-attrs
tag onStack Overflow
Available as part of theTidelift Subscription.
The maintainers ofattrs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications.Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
About
Python Classes Without Boilerplate
Topics
Resources
License
Code of conduct
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.