[Feature] Use typing.Annotated for customization
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 35/100
Research direction
Review the existing converter-customization path and the proposed cattrs.annotations API, then compare it with typing.get_type_hints and the Annotated example in this issue. Done means the supported metadata behavior, backward-compatibility expectations, and implications for issues #352 and #552 are defined and verified.
Written by the indexing model from the issue text.
Description
- cattrs version: 23.2.3
- Python version: 3.12
- Operating System: MacOS
Description
There's a decent amount of overhead in creating separate converters that needs to be done, which can get cumbersome quickly for a large number of classes. I was thinking it'd be possible to use typing.Annotated to reduce this work in a backwards-compatible way, without messing up type checking for those who need it.
An example that could solve (#352 and #552 if I understand them correctly)
from typing import Annotated
import cattrs.annotations as ca # hypothetically
class SomeKVPair:
key: Annotated[str, ca.Rename("Key")]
data_size: Annotated[int, ca.FromNested("Data.Size")]
value: Annotated[bytes, ca.AsBase64, ca.Rename("Value")] = b""
There are a few benefits to this:
- Type checkers will still understand the annotations.
- No need to rely on metadata inserted using
attrs.field()or similar. - It's clear to anyone looking at just the class what transforms are made. If they want to do their own serialization (e.g. create an XML serializer) it'll be clear what transforms they need to do.
- Getting the extra annotations is opt-in, so it'll be invisible to older versions of
cattrsthat don't support it. - Other libraries can also see these and use it for their own purposes.
- It's been available since 3.9. Version 3.8 goes EOL in October, so there's no need for compatibility shims.
Presumably this will be a non-trivial change, but I think it would be really valuable.
- Dominant language
- Python
- Stars
- 1.1k
- Forks
- 159
- Avg merge
- 12h 21m
- Merged PRs (30d)
- 6
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from python-attrs/cattrs
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
python-attrs/cattrs#761 · 2 comments ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 64/100
python-attrs/cattrs#513 · 4 comments ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 35/100
python-attrs/cattrs#779 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 85/100
python-attrs/cattrs#774 ·
-
Difficulty 5/5 Over a week Newbie friendliness 35/100
python-attrs/cattrs#746 · 2 comments ·
All issues in python-attrs/cattrs
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
zostera/django-bootstrap4#894 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
use-agent-os/agent-os#3276 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
zephyrproject-rtos/zephyr#119726 ·
-
area/auth bug comp/agent P3 platform/discord type/security
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
NousResearch/hermes-agent#117848 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
zilliztech/memsearch#759 ·