python-attrs / python-attrs/attrs
Can only populate attrs classes with `_CountingAttr` instances
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 5.8k
- Forks
- 480
- Avg merge
- 2h 15m
- Merged PRs (30d)
- 2
Description
A user might want to use attributes from an already @defined class to populate a new attrs class. However, _ClassBuilder expects all given attributes to be instances of _CountingAttr instead of Attribute instances, which raises an exception when provided:
import attrs
@attrs.define
class Example:
a: int
ExampleCopy = attrs.make_class("ExampleCopy", attrs={"a": attrs.fields(Example).a})
# AttributeError: 'Attribute' object has no attribute '_validator'. Did you mean: 'validator'?
@attrs.define(these={"a": attrs.fields(Example).a})
class ExampleCopy:
pass
# AttributeError: 'Attribute' object has no attribute '_validator'. Did you mean: 'validator'?
I would either expect _ClassBuilder to handle both kinds of attributes, or there be an officially sanctioned function allowing you to convert an Attribute to a _CountingAttr for cases like this. You can write this conversion function manually, something like:
def convert_to_countingattr(attr):
"""
Convert an `Attribute` instance to an equivalent `_CountingAttr` instance.
"""
return attrs.field(**{
slot: getattr(attr, slot)
for slot in attr.__slots__
if slot not in {"name", "eq_key", "order_key", "inherited"}
})
But this feels janky and prone to breakage.
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.
Research direction
Start with the _ClassBuilder path used by attrs.make_class and attrs.define, and reproduce the examples with attrs.fields(Example).a. Determine whether existing Attribute instances should be accepted directly or converted through a supported API; done means the reported examples no longer raise the shown AttributeError and the chosen behavior is covered.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- tooling
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100