python-attrs / python-attrs/attrs
Typing error when defining an enum of an attrs class
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 5.8k
- Forks
- 480
- Avg merge
- 2h 15m
- Merged PRs (30d)
- 2
Description
When trying to define an enum of an @attrs.define class, Mypy gives typing errors, but it works in runtime.
When trying to define an enum of an @attrs.frozen class, Mypy doesn't give an error, but it errors at runtime.
When trying to define an enum of a @dataclasses.dataclass class, Mypy doesn't give an error, and it works at runtime.
I started noticing this today after I removed support for Python 3.9 from my project, and ran poetry update.
from dataclasses import dataclass
from enum import Enum
import attrs
from pytest import raises
@attrs.define
class AttrsDefine:
a: int
b: float
# error: Definition of "__hash__" in base class "AttrsDefine" is incompatible with definition in base class "Enum" [misc]
class AttrsDefineEnum(AttrsDefine, Enum):
X = (1, 2.0)
Y = (3, 4.0)
@attrs.frozen
class AttrsFrozen:
a: int
b: float
@dataclass
class Dataclass:
a: int
b: float
class DataclassEnum(Dataclass, Enum):
X = (1, 2.0)
Y = (3, 4.0)
def test_enums() -> None:
with raises(attrs.exceptions.FrozenInstanceError) as exc_info:
# attr.exceptions.FrozenInstanceError
class AttrsFrozenEnum(AttrsFrozen, Enum):
X = (1, 2.0)
Y = (3, 4.0)
print(repr(AttrsFrozenEnum.X))
print(exc_info.exconly())
print(repr(AttrsDefineEnum.X))
print(repr(DataclassEnum.X))
❯ mypy attrenum.py
attrenum.py:15: error: Definition of "__hash__" in base class "AttrsDefine" is incompatible with definition in base class "Enum" [misc]
Found 1 error in 1 file (checked 1 source file)
❯ pytest -s attrenum.py
=================================================================================== test session starts ===================================================================================
platform linux -- Python 3.11.6, pytest-7.4.0, pluggy-1.2.0
rootdir: /home/micael/projects/playground
collected 1 item
attrenum.py attr.exceptions.FrozenInstanceError
AttrsDefineEnum(a=1, b=2.0)
<DataclassEnum.X: Dataclass(a=1, b=2.0)>
.
==================================================================================== 1 passed in 0.01s ====================================================================================
❯ python --version
Python 3.11.4
❯ mypy --version
mypy 1.10.0 (compiled: yes)
❯ pip freeze
attrs==23.2.0
iniconfig==2.0.0
mypy==1.10.0
mypy-extensions==1.0.0
packaging==24.0
pluggy==1.5.0
pytest==8.2.1
typing_extensions==4.11.0
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 by running the supplied Python reproduction with attrs.define, attrs.frozen, dataclasses.dataclass, Enum, and mypy to confirm the differing typing and runtime behavior. Trace the attrs-generated methods involved in enum multiple inheritance, then add focused regression coverage showing the intended consistency between mypy results and runtime behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- developer-experience
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100