Adding all files
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,443 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: propcache
|
||||
Version: 0.4.1
|
||||
Summary: Accelerated property cache
|
||||
Home-page: https://github.com/aio-libs/propcache
|
||||
Author: Andrew Svetlov
|
||||
Author-email: andrew.svetlov@gmail.com
|
||||
Maintainer: aiohttp team <team@aiohttp.org>
|
||||
Maintainer-email: team@aiohttp.org
|
||||
License: Apache-2.0
|
||||
Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org
|
||||
Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org
|
||||
Project-URL: CI: GitHub Workflows, https://github.com/aio-libs/propcache/actions?query=branch:master
|
||||
Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md
|
||||
Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/propcache
|
||||
Project-URL: Docs: Changelog, https://propcache.readthedocs.io/en/latest/changes/
|
||||
Project-URL: Docs: RTD, https://propcache.readthedocs.io
|
||||
Project-URL: GitHub: issues, https://github.com/aio-libs/propcache/issues
|
||||
Project-URL: GitHub: repo, https://github.com/aio-libs/propcache
|
||||
Keywords: cython,cext,propcache
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: Apache Software License
|
||||
Classifier: Programming Language :: Cython
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Topic :: Internet :: WWW/HTTP
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
License-File: NOTICE
|
||||
Dynamic: license-file
|
||||
|
||||
propcache
|
||||
=========
|
||||
|
||||
The module provides a fast implementation of cached properties for Python 3.9+.
|
||||
|
||||
.. image:: https://github.com/aio-libs/propcache/actions/workflows/ci-cd.yml/badge.svg
|
||||
:target: https://github.com/aio-libs/propcache/actions?query=workflow%3ACI
|
||||
:align: right
|
||||
|
||||
.. image:: https://codecov.io/gh/aio-libs/propcache/branch/master/graph/badge.svg
|
||||
:target: https://codecov.io/gh/aio-libs/propcache
|
||||
|
||||
.. image:: https://badge.fury.io/py/propcache.svg
|
||||
:target: https://badge.fury.io/py/propcache
|
||||
|
||||
|
||||
.. image:: https://readthedocs.org/projects/propcache/badge/?version=latest
|
||||
:target: https://propcache.readthedocs.io
|
||||
|
||||
|
||||
.. image:: https://img.shields.io/pypi/pyversions/propcache.svg
|
||||
:target: https://pypi.python.org/pypi/propcache
|
||||
|
||||
.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat
|
||||
:target: https://matrix.to/#/%23aio-libs:matrix.org
|
||||
:alt: Matrix Room — #aio-libs:matrix.org
|
||||
|
||||
.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat
|
||||
:target: https://matrix.to/#/%23aio-libs-space:matrix.org
|
||||
:alt: Matrix Space — #aio-libs-space:matrix.org
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
The API is designed to be nearly identical to the built-in ``functools.cached_property`` class,
|
||||
except for the additional ``under_cached_property`` class which uses ``self._cache``
|
||||
instead of ``self.__dict__`` to store the cached values and prevents ``__set__`` from being called.
|
||||
|
||||
For full documentation please read https://propcache.readthedocs.io.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
::
|
||||
|
||||
$ pip install propcache
|
||||
|
||||
The library is Python 3 only!
|
||||
|
||||
PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install
|
||||
``propcache`` on another operating system where wheels are not provided,
|
||||
the the tarball will be used to compile the library from
|
||||
the source code. It requires a C compiler and and Python headers installed.
|
||||
|
||||
To skip the compilation you must explicitly opt-in by using a PEP 517
|
||||
configuration setting ``pure-python``, or setting the ``PROPCACHE_NO_EXTENSIONS``
|
||||
environment variable to a non-empty value, e.g.:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip install propcache --config-settings=pure-python=false
|
||||
|
||||
Please note that the pure-Python (uncompiled) version is much slower. However,
|
||||
PyPy always uses a pure-Python implementation, and, as such, it is unaffected
|
||||
by this variable.
|
||||
|
||||
|
||||
API documentation
|
||||
------------------
|
||||
|
||||
The documentation is located at https://propcache.readthedocs.io.
|
||||
|
||||
Source code
|
||||
-----------
|
||||
|
||||
The project is hosted on GitHub_
|
||||
|
||||
Please file an issue on the `bug tracker
|
||||
<https://github.com/aio-libs/propcache/issues>`_ if you have found a bug
|
||||
or have some suggestion in order to improve the library.
|
||||
|
||||
Discussion list
|
||||
---------------
|
||||
|
||||
*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs
|
||||
|
||||
Feel free to post your questions and ideas here.
|
||||
|
||||
|
||||
Authors and License
|
||||
-------------------
|
||||
|
||||
The ``propcache`` package is derived from ``yarl`` which is written by Andrew Svetlov.
|
||||
|
||||
It's *Apache 2* licensed and freely available.
|
||||
|
||||
|
||||
.. _GitHub: https://github.com/aio-libs/propcache
|
||||
|
||||
=========
|
||||
Changelog
|
||||
=========
|
||||
|
||||
..
|
||||
You should *NOT* be adding new change log entries to this file, this
|
||||
file is managed by towncrier. You *may* edit previous change logs to
|
||||
fix problems like typo corrections or such.
|
||||
To add a new change log entry, please see
|
||||
https://pip.pypa.io/en/latest/development/#adding-a-news-entry
|
||||
we named the news folder "changes".
|
||||
|
||||
WARNING: Don't drop the next directive!
|
||||
|
||||
.. towncrier release notes start
|
||||
|
||||
0.4.1
|
||||
=====
|
||||
|
||||
*(2025-10-08)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Fixed reference leak caused by ``Py_INCREF`` because Cython has its own reference counter systems -- by `@Vizonex <https://github.com/sponsors/Vizonex>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#162 <https://github.com/aio-libs/propcache/issues/162>`__.
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- Fixes the default value for the ``os``
|
||||
parameter in ``reusable-build-wheel.yml``
|
||||
to be ``ubuntu-latest`` instead of
|
||||
``ubuntu``.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#155 <https://github.com/aio-libs/propcache/issues/155>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.4.0
|
||||
=====
|
||||
|
||||
*(2025-10-04)*
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Optimized propcache by replacing sentinel ``object`` for checking if
|
||||
the ``object`` is ``NULL`` and changed ``dict`` API for
|
||||
Python C-API -- by `@Vizonex <https://github.com/sponsors/Vizonex>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#121 <https://github.com/aio-libs/propcache/issues/121>`__.
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- Builds have been added for arm64 Windows
|
||||
wheels and the ``reusable-build-wheel.yml``
|
||||
workflow has been modified to allow for
|
||||
an OS value (``windows-11-arm``) which
|
||||
does not include the ``-latest`` postfix
|
||||
-- by `@finnagin <https://github.com/sponsors/finnagin>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#133 <https://github.com/aio-libs/propcache/issues/133>`__.
|
||||
|
||||
- Added CI for CPython 3.14 -- by `@kumaraditya303 <https://github.com/sponsors/kumaraditya303>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#140 <https://github.com/aio-libs/propcache/issues/140>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.3.2
|
||||
=====
|
||||
|
||||
*(2025-06-09)*
|
||||
|
||||
|
||||
Improved documentation
|
||||
----------------------
|
||||
|
||||
- Fixed incorrect decorator usage in the ``~propcache.api.under_cached_property`` example code -- by `@meanmail <https://github.com/sponsors/meanmail>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#109 <https://github.com/aio-libs/propcache/issues/109>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#117 <https://github.com/aio-libs/propcache/issues/117>`__.
|
||||
|
||||
- Made Cython line tracing opt-in via the ``with-cython-tracing`` build config setting -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
Previously, line tracing was enabled by default in ``pyproject.toml``, which caused build issues for some users and made wheels nearly twice as slow.
|
||||
|
||||
Now line tracing is only enabled when explicitly requested via ``pip install . --config-setting=with-cython-tracing=true`` or by setting the ``PROPCACHE_CYTHON_TRACING`` environment variable.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#118 <https://github.com/aio-libs/propcache/issues/118>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.3.1
|
||||
=====
|
||||
|
||||
*(2025-03-25)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Improved typing annotations, fixing some type errors under correct usage
|
||||
and improving typing robustness generally -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#103 <https://github.com/aio-libs/propcache/issues/103>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.3.0
|
||||
=====
|
||||
|
||||
*(2025-02-20)*
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#84 <https://github.com/aio-libs/propcache/issues/84>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#84 <https://github.com/aio-libs/propcache/issues/84>`__.
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem
|
||||
dependencies using `re-actors/cache-python-deps`_ -- an action by
|
||||
`@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact
|
||||
version of Python runtime.
|
||||
|
||||
.. _`re-actors/cache-python-deps`:
|
||||
https://github.com/marketplace/actions/cache-python-deps
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#93 <https://github.com/aio-libs/propcache/issues/93>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.2.1
|
||||
=====
|
||||
|
||||
*(2024-12-01)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Stopped implicitly allowing the use of Cython pre-release versions when
|
||||
building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and
|
||||
`@markgreene74 <https://github.com/sponsors/markgreene74>`__.
|
||||
|
||||
*Related commits on GitHub:*
|
||||
`64df0a6 <https://github.com/aio-libs/propcache/commit/64df0a6>`__.
|
||||
|
||||
- Fixed ``wrapped`` and ``func`` not being accessible in the Cython versions of ``propcache.api.cached_property`` and ``propcache.api.under_cached_property`` decorators -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#72 <https://github.com/aio-libs/propcache/issues/72>`__.
|
||||
|
||||
|
||||
Removals and backward incompatible breaking changes
|
||||
---------------------------------------------------
|
||||
|
||||
- Removed support for Python 3.8 as it has reached end of life -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#57 <https://github.com/aio-libs/propcache/issues/57>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Stopped implicitly allowing the use of Cython pre-release versions when
|
||||
building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and
|
||||
`@markgreene74 <https://github.com/sponsors/markgreene74>`__.
|
||||
|
||||
*Related commits on GitHub:*
|
||||
`64df0a6 <https://github.com/aio-libs/propcache/commit/64df0a6>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.2.0
|
||||
=====
|
||||
|
||||
*(2024-10-07)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Fixed loading the C-extensions on Python 3.8 -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#26 <https://github.com/aio-libs/propcache/issues/26>`__.
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Improved typing for the ``propcache.api.under_cached_property`` decorator -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#38 <https://github.com/aio-libs/propcache/issues/38>`__.
|
||||
|
||||
|
||||
Improved documentation
|
||||
----------------------
|
||||
|
||||
- Added API documentation for the ``propcache.api.cached_property`` and ``propcache.api.under_cached_property`` decorators -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#16 <https://github.com/aio-libs/propcache/issues/16>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Moved ``propcache.api.under_cached_property`` and ``propcache.api.cached_property`` to `propcache.api` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
Both decorators remain importable from the top-level package, however importing from `propcache.api` is now the recommended way to use them.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#19 <https://github.com/aio-libs/propcache/issues/19>`__, `#24 <https://github.com/aio-libs/propcache/issues/24>`__, `#32 <https://github.com/aio-libs/propcache/issues/32>`__.
|
||||
|
||||
- Converted project to use a src layout -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#22 <https://github.com/aio-libs/propcache/issues/22>`__, `#29 <https://github.com/aio-libs/propcache/issues/29>`__, `#37 <https://github.com/aio-libs/propcache/issues/37>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.1.0
|
||||
=====
|
||||
|
||||
*(2024-10-03)*
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Added ``armv7l`` wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#5 <https://github.com/aio-libs/propcache/issues/5>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.0.0
|
||||
=====
|
||||
|
||||
*(2024-10-02)*
|
||||
|
||||
|
||||
- Initial release.
|
||||
Binary file not shown.
@@ -0,0 +1,235 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: attrs
|
||||
Version: 25.4.0
|
||||
Summary: Classes Without Boilerplate
|
||||
Project-URL: Documentation, https://www.attrs.org/
|
||||
Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html
|
||||
Project-URL: GitHub, https://github.com/python-attrs/attrs
|
||||
Project-URL: Funding, https://github.com/sponsors/hynek
|
||||
Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi
|
||||
Author-email: Hynek Schlawack <hs@ox.cx>
|
||||
License-Expression: MIT
|
||||
License-File: LICENSE
|
||||
Keywords: attribute,boilerplate,class
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Typing :: Typed
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.attrs.org/">
|
||||
<img src="https://raw.githubusercontent.com/python-attrs/attrs/main/docs/_static/attrs_logo.svg" width="35%" alt="attrs" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
*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](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)).
|
||||
Trusted by NASA for [Mars missions since 2020](https://github.com/readme/featured/nasa-ingenuity-helicopter)!
|
||||
|
||||
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](https://github.com/sponsors/hynek).
|
||||
Especially those generously supporting us at the *The Organization* tier and higher:
|
||||
|
||||
<!-- sponsor-break-begin -->
|
||||
|
||||
<p align="center">
|
||||
|
||||
<!-- [[[cog
|
||||
import pathlib, tomllib
|
||||
|
||||
for sponsor in tomllib.loads(pathlib.Path("pyproject.toml").read_text())["tool"]["sponcon"]["sponsors"]:
|
||||
print(f'<a href="{sponsor["url"]}"><img title="{sponsor["title"]}" src="https://www.attrs.org/en/25.4.0/_static/sponsors/{sponsor["img"]}" width="190" /></a>')
|
||||
]]] -->
|
||||
<a href="https://www.variomedia.de/"><img title="Variomedia AG" src="https://www.attrs.org/en/25.4.0/_static/sponsors/Variomedia.svg" width="190" /></a>
|
||||
<a href="https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek"><img title="Tidelift" src="https://www.attrs.org/en/25.4.0/_static/sponsors/Tidelift.svg" width="190" /></a>
|
||||
<a href="https://privacy-solutions.org/"><img title="Privacy Solutions" src="https://www.attrs.org/en/25.4.0/_static/sponsors/Privacy-Solutions.svg" width="190" /></a>
|
||||
<a href="https://filepreviews.io/"><img title="FilePreviews" src="https://www.attrs.org/en/25.4.0/_static/sponsors/FilePreviews.svg" width="190" /></a>
|
||||
<a href="https://polar.sh/"><img title="Polar" src="https://www.attrs.org/en/25.4.0/_static/sponsors/Polar.svg" width="190" /></a>
|
||||
<!-- [[[end]]] -->
|
||||
|
||||
</p>
|
||||
|
||||
<!-- sponsor-break-end -->
|
||||
|
||||
<p align="center">
|
||||
<strong>Please consider <a href="https://github.com/sponsors/hynek">joining them</a> to help make <em>attrs</em>’s maintenance more sustainable!</strong>
|
||||
</p>
|
||||
|
||||
<!-- teaser-end -->
|
||||
|
||||
## Example
|
||||
|
||||
*attrs* gives you a class decorator and a way to declaratively define the attributes on that class:
|
||||
|
||||
<!-- code-begin -->
|
||||
|
||||
```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.
|
||||
|
||||
---
|
||||
|
||||
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**.
|
||||
|
||||
Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation!
|
||||
|
||||
|
||||
### Hate Type Annotations!?
|
||||
|
||||
No problem!
|
||||
Types are entirely **optional** with *attrs*.
|
||||
Simply assign `attrs.field()` to the attributes instead of annotating them with types:
|
||||
|
||||
```python
|
||||
from attrs import define, field
|
||||
|
||||
@define
|
||||
class SomeClass:
|
||||
a_number = field(default=42)
|
||||
list_of_numbers = field(factory=list)
|
||||
```
|
||||
|
||||
|
||||
## Data Classes
|
||||
|
||||
On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*).
|
||||
In practice it does a lot more and is more flexible.
|
||||
For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger.
|
||||
|
||||
For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), 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.
|
||||
|
||||
|
||||
## Project Information
|
||||
|
||||
- [**Changelog**](https://www.attrs.org/en/stable/changelog.html)
|
||||
- [**Documentation**](https://www.attrs.org/)
|
||||
- [**PyPI**](https://pypi.org/project/attrs/)
|
||||
- [**Source Code**](https://github.com/python-attrs/attrs)
|
||||
- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md)
|
||||
- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs)
|
||||
- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs)
|
||||
|
||||
|
||||
### *attrs* for Enterprise
|
||||
|
||||
Available as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek).
|
||||
|
||||
The maintainers of *attrs* 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.
|
||||
|
||||
## Release Information
|
||||
|
||||
### Backwards-incompatible Changes
|
||||
|
||||
- Class-level `kw_only=True` behavior is now consistent with `dataclasses`.
|
||||
|
||||
Previously, a class that sets `kw_only=True` makes all attributes keyword-only, including those from base classes.
|
||||
If an attribute sets `kw_only=False`, that setting is ignored, and it is still made keyword-only.
|
||||
|
||||
Now, only the attributes defined in that class that doesn't explicitly set `kw_only=False` are made keyword-only.
|
||||
|
||||
This shouldn't be a problem for most users, unless you have a pattern like this:
|
||||
|
||||
```python
|
||||
@attrs.define(kw_only=True)
|
||||
class Base:
|
||||
a: int
|
||||
b: int = attrs.field(default=1, kw_only=False)
|
||||
|
||||
@attrs.define
|
||||
class Subclass(Base):
|
||||
c: int
|
||||
```
|
||||
|
||||
Here, we have a `kw_only=True` *attrs* class (`Base`) with an attribute that sets `kw_only=False` and has a default (`Base.b`), and then create a subclass (`Subclass`) with required arguments (`Subclass.c`).
|
||||
Previously this would work, since it would make `Base.b` keyword-only, but now this fails since `Base.b` is positional, and we have a required positional argument (`Subclass.c`) following another argument with defaults.
|
||||
[#1457](https://github.com/python-attrs/attrs/issues/1457)
|
||||
|
||||
|
||||
### Changes
|
||||
|
||||
- Values passed to the `__init__()` method of `attrs` classes are now correctly passed to `__attrs_pre_init__()` instead of their default values (in cases where *kw_only* was not specified).
|
||||
[#1427](https://github.com/python-attrs/attrs/issues/1427)
|
||||
- Added support for Python 3.14 and [PEP 749](https://peps.python.org/pep-0749/).
|
||||
[#1446](https://github.com/python-attrs/attrs/issues/1446),
|
||||
[#1451](https://github.com/python-attrs/attrs/issues/1451)
|
||||
- `attrs.validators.deep_mapping()` now allows to leave out either *key_validator* xor *value_validator*.
|
||||
[#1448](https://github.com/python-attrs/attrs/issues/1448)
|
||||
- `attrs.validators.deep_iterator()` and `attrs.validators.deep_mapping()` now accept lists and tuples for all validators and wrap them into a `attrs.validators.and_()`.
|
||||
[#1449](https://github.com/python-attrs/attrs/issues/1449)
|
||||
- Added a new **experimental** way to inspect classes:
|
||||
|
||||
`attrs.inspect(cls)` returns the _effective_ class-wide parameters that were used by *attrs* to construct the class.
|
||||
|
||||
The returned class is the same data structure that *attrs* uses internally to decide how to construct the final class.
|
||||
[#1454](https://github.com/python-attrs/attrs/issues/1454)
|
||||
- Fixed annotations for `attrs.field(converter=...)`.
|
||||
Previously, a `tuple` of converters was only accepted if it had exactly one element.
|
||||
[#1461](https://github.com/python-attrs/attrs/issues/1461)
|
||||
- The performance of `attrs.asdict()` has been improved by 45–260%.
|
||||
[#1463](https://github.com/python-attrs/attrs/issues/1463)
|
||||
- The performance of `attrs.astuple()` has been improved by 49–270%.
|
||||
[#1469](https://github.com/python-attrs/attrs/issues/1469)
|
||||
- The type annotation for `attrs.validators.or_()` now allows for different types of validators.
|
||||
|
||||
This was only an issue on Pyright.
|
||||
[#1474](https://github.com/python-attrs/attrs/issues/1474)
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
[Full changelog →](https://www.attrs.org/en/stable/changelog.html)
|
||||
Reference in New Issue
Block a user