Port variant | v12 |
Summary | Classes Without Boilerplate (3.12) |
Package version | 23.2.0 |
Homepage | No known homepage |
Keywords | python |
Maintainer | Python Automaton |
License | Not yet specified |
Other variants | v11 |
Ravenports | Buildsheet | History |
Ravensource | Port Directory | History |
Last modified | 06 JAN 2024, 17:04:35 UTC |
Port created | 06 AUG 2019, 14:27:27 UTC |
single | [image] *attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods]). [Trusted by NASA] for Mars missions since 2020! Its main goal is to help you to write **concise** and **correct** software without slowing down your code. ## Sponsors *attrs* would not be possible without our [amazing sponsors]. Especially those generously supporting us at the *The Organization* tier and higher:[image] [image] [image] Please consider joining them to help make attrs’s maintenance more sustainable! ## Example *attrs* gives you a class decorator and a way to declaratively define the attributes on that class: ```pycon >>> from attrs import asdict, define, make_class, Factory >>> @define ... class SomeClass: ... a_number: int = 42 ... list_of_numbers: list[int] = Factory(list) ... ... def hard_math(self, another_number): ... return self.a_number + sum(self.list_of_numbers) * another_number >>> sc = SomeClass(1, [1, 2, 3]) >>> sc SomeClass(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') ``` After *declaring* 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 and *without* runtime performance penalties. **Hate type annotations**!? No problem! Types are entirely **optional** with *attrs*. Simply assign `attrs.field()` to the attributes instead of annotating them with types. --- This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* 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 the `attr` package import name will remain **indefinitely**. Please check out [*On The Core API Names*] for a more in-depth explanation. |
Build (only) |
python312:dev:standard python-pip:single:v12 autoselect-python:single:standard |
Build and Runtime | python312:primary:standard |
main | mirror://PYPIWHL/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f |
python-Automat:v12 | Self-service finite-state machines (3.12) |
python-Twisted:v12 | Asynchronous networking framework (3.12) |
python-aiohttp:v12 | Async http client/server framework (3.12) |
python-cattrs:v12 | Composable complex class support for attrs (3.12) |
python-jsonschema:v12 | Alternate implementation of JSON Schema (3.12) |
python-referencing:v12 | JSON Referencing + Python (3.12) |
python-requests-cache:v12 | Persistent cache for python requests (3.12) |
python-statmake:v12 | Applies STAT Stylespace to a variable font (3.12) |
python-ufoLib2:v12 | UfoLib2 is a UFO font processing library (3.12) |