Spaces:
Running
Running
Metadata-Version: 2.1 | |
Name: cattrs | |
Version: 1.5.0 | |
Summary: Composable complex class support for attrs and dataclasses. | |
Home-page: https://github.com/Tinche/cattrs | |
Author: Tin Tvrtković | |
Author-email: tinchester@gmail.com | |
License: MIT license | |
Keywords: cattrs | |
Platform: UNKNOWN | |
Classifier: Development Status :: 4 - Beta | |
Classifier: Intended Audience :: Developers | |
Classifier: License :: OSI Approved :: MIT License | |
Classifier: Natural Language :: English | |
Classifier: Programming Language :: Python :: 3 | |
Classifier: Programming Language :: Python :: 3.7 | |
Classifier: Programming Language :: Python :: 3.8 | |
Classifier: Programming Language :: Python :: 3.9 | |
Requires-Python: ~=3.7 | |
Requires-Dist: attrs (>=20.1.0) | |
Provides-Extra: dev | |
Requires-Dist: bumpversion ; extra == 'dev' | |
Requires-Dist: wheel ; extra == 'dev' | |
Requires-Dist: watchdog ; extra == 'dev' | |
Requires-Dist: flake8 ; extra == 'dev' | |
Requires-Dist: tox ; extra == 'dev' | |
Requires-Dist: coverage ; extra == 'dev' | |
Requires-Dist: Sphinx ; extra == 'dev' | |
Requires-Dist: pytest ; extra == 'dev' | |
Requires-Dist: pytest-benchmark ; extra == 'dev' | |
Requires-Dist: hypothesis ; extra == 'dev' | |
Requires-Dist: pendulum ; extra == 'dev' | |
Requires-Dist: isort ; extra == 'dev' | |
Requires-Dist: black ; extra == 'dev' | |
Requires-Dist: immutables ; extra == 'dev' | |
====== | |
cattrs | |
====== | |
.. image:: https://img.shields.io/pypi/v/cattrs.svg | |
:target: https://pypi.python.org/pypi/cattrs | |
.. image:: https://github.com/Tinche/cattrs/workflows/CI/badge.svg | |
:target: https://github.com/Tinche/cattrs/actions?workflow=CI | |
.. image:: https://readthedocs.org/projects/cattrs/badge/?version=latest | |
:target: https://cattrs.readthedocs.io/en/latest/?badge=latest | |
:alt: Documentation Status | |
.. image:: https://img.shields.io/pypi/pyversions/cattrs.svg | |
:target: https://github.com/Tinche/cattrs | |
:alt: Supported Python versions | |
.. image:: https://codecov.io/gh/Tinche/cattrs/branch/master/graph/badge.svg | |
:target: https://codecov.io/gh/Tinche/cattrs | |
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg | |
:target: https://github.com/ambv/black | |
---- | |
``cattrs`` is an open source Python library for structuring and unstructuring | |
data. ``cattrs`` works best with ``attrs`` classes, dataclasses and the usual | |
Python collections, but other kinds of classes are supported by manually | |
registering converters. | |
Python has a rich set of powerful, easy to use, built-in data types like | |
dictionaries, lists and tuples. These data types are also the lingua franca | |
of most data serialization libraries, for formats like json, msgpack, yaml or | |
toml. | |
Data types like this, and mappings like ``dict`` s in particular, represent | |
unstructured data. Your data is, in all likelihood, structured: not all | |
combinations of field names are values are valid inputs to your programs. In | |
Python, structured data is better represented with classes and enumerations. | |
``attrs`` is an excellent library for declaratively describing the structure of | |
your data, and validating it. | |
When you're handed unstructured data (by your network, file system, database...), | |
``cattrs`` helps to convert this data into structured data. When you have to | |
convert your structured data into data types other libraries can handle, | |
``cattrs`` turns your classes and enumerations into dictionaries, integers and | |
strings. | |
Here's a simple taste. The list containing a float, an int and a string | |
gets converted into a tuple of three ints. | |
.. code-block:: pycon | |
>>> import cattr | |
>>> | |
>>> cattr.structure([1.0, 2, "3"], tuple[int, int, int]) | |
(1, 2, 3) | |
``cattrs`` works well with ``attrs`` classes out of the box. | |
.. code-block:: pycon | |
>>> import attr, cattr | |
>>> | |
>>> @attr.frozen # It works with normal classes too. | |
... class C: | |
... a = attr.ib() | |
... b = attr.ib() | |
... | |
>>> instance = C(1, 'a') | |
>>> cattr.unstructure(instance) | |
{'a': 1, 'b': 'a'} | |
>>> cattr.structure({'a': 1, 'b': 'a'}, C) | |
C(a=1, b='a') | |
Here's a much more complex example, involving ``attrs`` classes with type | |
metadata. | |
.. code-block:: pycon | |
>>> from enum import unique, Enum | |
>>> from typing import Optional, Sequence, Union | |
>>> from cattr import structure, unstructure | |
>>> import attr | |
>>> | |
>>> @unique | |
... class CatBreed(Enum): | |
... SIAMESE = "siamese" | |
... MAINE_COON = "maine_coon" | |
... SACRED_BIRMAN = "birman" | |
... | |
>>> @attr.define | |
... class Cat: | |
... breed: CatBreed | |
... names: Sequence[str] | |
... | |
>>> @attr.define | |
... class DogMicrochip: | |
... chip_id = attr.ib() | |
... time_chipped: float = attr.ib() | |
... | |
>>> @attr.define | |
... class Dog: | |
... cuteness: int | |
... chip: Optional[DogMicrochip] | |
... | |
>>> p = unstructure([Dog(cuteness=1, chip=DogMicrochip(chip_id=1, time_chipped=10.0)), | |
... Cat(breed=CatBreed.MAINE_COON, names=('Fluffly', 'Fluffer'))]) | |
... | |
>>> print(p) | |
[{'cuteness': 1, 'chip': {'chip_id': 1, 'time_chipped': 10.0}}, {'breed': 'maine_coon', 'names': ('Fluffly', 'Fluffer')}] | |
>>> print(structure(p, list[Union[Dog, Cat]])) | |
[Dog(cuteness=1, chip=DogMicrochip(chip_id=1, time_chipped=10.0)), Cat(breed=<CatBreed.MAINE_COON: 'maine_coon'>, names=['Fluffly', 'Fluffer'])] | |
Consider unstructured data a low-level representation that needs to be converted | |
to structured data to be handled, and use ``structure``. When you're done, | |
``unstructure`` the data to its unstructured form and pass it along to another | |
library or module. Use `attrs type metadata <http://attrs.readthedocs.io/en/stable/examples.html#types>`_ | |
to add type metadata to attributes, so ``cattrs`` will know how to structure and | |
destructure them. | |
* Free software: MIT license | |
* Documentation: https://cattrs.readthedocs.io. | |
* Python versions supported: 3.7 and up. (Older Python versions, like 2.7, 3.5 and 3.6 are supported by older versions; see the changelog.) | |
Features | |
-------- | |
* Converts structured data into unstructured data, recursively: | |
* ``attrs`` classes and dataclasses are converted into dictionaries in a way similar to ``attr.asdict``, or into tuples in a way similar to ``attr.astuple``. | |
* Enumeration instances are converted to their values. | |
* Other types are let through without conversion. This includes types such as | |
integers, dictionaries, lists and instances of non-``attrs`` classes. | |
* Custom converters for any type can be registered using ``register_unstructure_hook``. | |
* Converts unstructured data into structured data, recursively, according to | |
your specification given as a type. The following types are supported: | |
* ``typing.Optional[T]``. | |
* ``typing.List[T]``, ``typing.MutableSequence[T]``, ``typing.Sequence[T]`` (converts to a list). | |
* ``typing.Tuple`` (both variants, ``Tuple[T, ...]`` and ``Tuple[X, Y, Z]``). | |
* ``typing.MutableSet[T]``, ``typing.Set[T]`` (converts to a set). | |
* ``typing.FrozenSet[T]`` (converts to a frozenset). | |
* ``typing.Dict[K, V]``, ``typing.MutableMapping[K, V]``, ``typing.Mapping[K, V]`` (converts to a dict). | |
* ``attrs`` classes with simple attributes and the usual ``__init__``. | |
* Simple attributes are attributes that can be assigned unstructured data, | |
like numbers, strings, and collections of unstructured data. | |
* All `attrs` classes and dataclasses with the usual ``__init__``, if their complex attributes have type metadata. | |
* ``typing.Union`` s of supported ``attrs`` classes, given that all of the classes have a unique field. | |
* ``typing.Union`` s of anything, given that you provide a disambiguation function for it. | |
* Custom converters for any type can be registered using ``register_structure_hook``. | |
Credits | |
------- | |
Major credits to Hynek Schlawack for creating attrs_ and its predecessor, | |
characteristic_. | |
``cattrs`` is tested with Hypothesis_, by David R. MacIver. | |
``cattrs`` is benchmarked using perf_ and pytest-benchmark_. | |
This package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template. | |
.. _attrs: https://github.com/hynek/attrs | |
.. _characteristic: https://github.com/hynek/characteristic | |
.. _Hypothesis: http://hypothesis.readthedocs.io/en/latest/ | |
.. _perf: https://github.com/haypo/perf | |
.. _pytest-benchmark: https://pytest-benchmark.readthedocs.io/en/latest/index.html | |
.. _Cookiecutter: https://github.com/audreyr/cookiecutter | |
.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage | |
======= | |
History | |
======= | |
1.5.0 (2021-04-15) | |
------------------ | |
* Fix an issue with ``GenConverter`` unstructuring ``attrs`` classes and dataclasses with generic fields. | |
(`#65 <https://github.com/Tinche/cattrs/issues/65>`_) | |
* ``GenConverter`` has support for easy overriding of collection unstructuring types (for example, unstructure all sets to lists) through its ``unstruct_collection_overrides`` argument. | |
(`#137 <https://github.com/Tinche/cattrs/pull/137>`_) | |
* Unstructuring mappings with ``GenConverter`` is significantly faster. | |
* ``GenConverter`` supports strict handling of unexpected dictionary keys through its ``forbid_extra_keys`` argument. | |
(`#142 <https://github.com/Tinche/cattrs/pull/142>`_) | |
1.4.0 (2021-03-21) | |
------------------ | |
* Fix an issue with ``GenConverter`` un/structuring hooks when a function hook is registered after the converter has already been used. | |
* Add support for ``collections.abc.{Sequence, MutableSequence, Set, MutableSet}``. These should be used on 3.9+ instead of their ``typing`` alternatives, which are deprecated. | |
(`#128 <https://github.com/Tinche/cattrs/issues/128>`_) | |
* The ``GenConverter`` will unstructure iterables (``list[T]``, ``tuple[T, ...]``, ``set[T]``) using their type argument instead of the runtime class if its elements, if possible. These unstructuring operations are up to 40% faster. | |
(`#129 <https://github.com/Tinche/cattrs/issues/129>`_) | |
* Flesh out ``Converter`` and ``GenConverter`` initializer type annotations. | |
(`#131 <https://github.com/Tinche/cattrs/issues/131>`_) | |
* Add support for ``typing.Annotated`` on Python 3.9+. ``cattrs`` will use the first annotation present. ``cattrs`` specific annotations may be added in the future. | |
(`#127 <https://github.com/Tinche/cattrs/issues/127>`_) | |
* Add support for dataclasses. | |
(`#43 <https://github.com/Tinche/cattrs/issues/43>`_) | |
1.3.0 (2021-02-25) | |
------------------ | |
* ``cattrs`` now has a benchmark suite to help make and keep cattrs the fastest it can be. The instructions on using it can be found under the `Benchmarking <https://cattrs.readthedocs.io/en/latest/benchmarking.html>` section in the docs. | |
(`#123 <https://github.com/Tinche/cattrs/pull/123>`_) | |
* Fix an issue unstructuring tuples of non-primitives. | |
(`#125 <https://github.com/Tinche/cattrs/issues/125>`_) | |
* ``cattrs`` now calls ``attr.resolve_types`` on ``attrs`` classes when registering un/structuring hooks. | |
* ``GenConverter`` structuring and unstructuring of ``attrs`` classes is significantly faster. | |
1.2.0 (2021-01-31) | |
------------------ | |
* ``converter.unstructure`` now supports an optional parameter, `unstructure_as`, which can be used to unstructure something as a different type. Useful for unions. | |
* Improve support for union un/structuring hooks. Flesh out docs for advanced union handling. | |
(`#115 <https://github.com/Tinche/cattrs/pull/115>`_) | |
* Fix `GenConverter` behavior with inheritance hierarchies of `attrs` classes. | |
(`#117 <https://github.com/Tinche/cattrs/pull/117>`_) (`#116 <https://github.com/Tinche/cattrs/issues/116>`_) | |
* Refactor `GenConverter.un/structure_attrs_fromdict` into `GenConverter.gen_un/structure_attrs_fromdict` to allow calling back to `Converter.un/structure_attrs_fromdict` without sideeffects. | |
(`#118 <https://github.com/Tinche/cattrs/issues/118>`_) | |
1.1.2 (2020-11-29) | |
------------------ | |
* The default disambiguator will not consider non-required fields any more. | |
(`#108 <https://github.com/Tinche/cattrs/pull/108>`_) | |
* Fix a couple type annotations. | |
(`#107 <https://github.com/Tinche/cattrs/pull/107>`_) (`#105 <https://github.com/Tinche/cattrs/issues/105>`_) | |
* Fix a `GenConverter` unstructuring issue and tests. | |
1.1.1 (2020-10-30) | |
------------------ | |
* Add metadata for supported Python versions. | |
(`#103 <https://github.com/Tinche/cattrs/pull/103>`_) | |
1.1.0 (2020-10-29) | |
------------------ | |
* Python 2, 3.5 and 3.6 support removal. If you need it, use a version below 1.1.0. | |
* Python 3.9 support, including support for built-in generic types (``list[int]`` vs ``typing.List[int]``). | |
* ``cattrs`` now includes functions to generate specialized structuring and unstructuring hooks. Specialized hooks are faster and support overrides (``omit_if_default`` and ``rename``). See the ``cattr.gen`` module. | |
* ``cattrs`` now includes a converter variant, ``cattr.GenConverter``, that automatically generates specialized hooks for attrs classes. This converter will become the default in the future. | |
* Generating specialized structuring hooks now invokes `attr.resolve_types <https://www.attrs.org/en/stable/api.html#attr.resolve_types>`_ on a class if the class makes use of the new PEP 563 annotations. | |
* ``cattrs`` now depends on ``attrs`` >= 20.1.0, because of ``attr.resolve_types``. | |
* Specialized hooks now support generic classes. The default converter will generate and use a specialized hook upon encountering a generic class. | |
1.0.0 (2019-12-27) | |
------------------ | |
* ``attrs`` classes with private attributes can now be structured by default. | |
* Structuring from dictionaries is now more lenient: extra keys are ignored. | |
* ``cattrs`` has improved type annotations for use with Mypy. | |
* Unstructuring sets and frozensets now works properly. | |
0.9.1 (2019-10-26) | |
------------------ | |
* Python 3.8 support. | |
0.9.0 (2018-07-22) | |
------------------ | |
* Python 3.7 support. | |
0.8.1 (2018-06-19) | |
------------------ | |
* The disambiguation function generator now supports unions of ``attrs`` classes and NoneType. | |
0.8.0 (2018-04-14) | |
------------------ | |
* Distribution fix. | |
0.7.0 (2018-04-12) | |
------------------ | |
* Removed the undocumented ``Converter.unstruct_strat`` property setter. | |
* | Removed the ability to set the ``Converter.structure_attrs`` instance field. | |
| As an alternative, create a new ``Converter``:: | |
| | |
| .. code-block:: python | |
| | |
| >>> converter = cattr.Converter(unstruct_strat=cattr.UnstructureStrategy.AS_TUPLE) | |
* Some micro-optimizations were applied; a ``structure(unstructure(obj))`` roundtrip | |
is now up to 2 times faster. | |
0.6.0 (2017-12-25) | |
------------------ | |
* Packaging fixes. | |
(`#17 <https://github.com/Tinche/cattrs/pull/17>`_) | |
0.5.0 (2017-12-11) | |
------------------ | |
* structure/unstructure now supports using functions as well as classes for deciding the appropriate function. | |
* added `Converter.register_structure_hook_func`, to register a function instead of a class for determining handler func. | |
* added `Converter.register_unstructure_hook_func`, to register a function instead of a class for determining handler func. | |
* vendored typing is no longer needed, nor provided. | |
* Attributes with default values can now be structured if they are missing in the input. | |
(`#15 <https://github.com/Tinche/cattrs/pull/15>`_) | |
* | `Optional` attributes can no longer be structured if they are missing in the input. | |
| In other words, this no longer works: | |
| | |
| .. code-block:: python | |
| | |
| @attr.s | |
| class A: | |
| a: Optional[int] = attr.ib() | |
| | |
| >>> cattr.structure({}, A) | |
| | |
* ``cattr.typed`` removed since the functionality is now present in ``attrs`` itself. | |
Replace instances of ``cattr.typed(type)`` with ``attr.ib(type=type)``. | |
0.4.0 (2017-07-17) | |
------------------ | |
* `Converter.loads` is now `Converter.structure`, and `Converter.dumps` is now `Converter.unstructure`. | |
* Python 2.7 is supported. | |
* Moved ``cattr.typing`` to ``cattr.vendor.typing`` to support different vendored versions of typing.py for Python 2 and Python 3. | |
* Type metadata can be added to ``attrs`` classes using ``cattr.typed``. | |
0.3.0 (2017-03-18) | |
------------------ | |
* Python 3.4 is no longer supported. | |
* Introduced ``cattr.typing`` for use with Python versions 3.5.2 and 3.6.0. | |
* Minor changes to work with newer versions of ``typing``. | |
* Bare Optionals are not supported any more (use ``Optional[Any]``). | |
* Attempting to load unrecognized classes will result in a ValueError, and a helpful message to register a loads hook. | |
* Loading ``attrs`` classes is now documented. | |
* The global converter is now documented. | |
* ``cattr.loads_attrs_fromtuple`` and ``cattr.loads_attrs_fromdict`` are now exposed. | |
0.2.0 (2016-10-02) | |
------------------ | |
* Tests and documentation. | |
0.1.0 (2016-08-13) | |
------------------ | |
* First release on PyPI. | |