Metaclass defined class attribute raise "name-defined" error when used as a type
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Using a Metaclass to define dynamic class (not instance) attributes raises name-defined error when trying to use an attribute as a type.
To Reproduce
Gist URL: https://gist.github.com/mypy-play/bb0277c6f339cbf374a1d2288cb7d5e6
Playground URL: https://mypy-play.net/?mypy=latest&python=3.12&gist=bb0277c6f339cbf374a1d2288cb7d5e6
from enum import Enum
class Message:
class Direction(Enum):
IN = "IN"
OUT = "OUT"
class MetaProtoWrapper(type):
def __getattribute__(cls, name: str):
try:
return super().__getattribute__(name)
except AttributeError:
return getattr(cls.Meta.protocol_buffer_type, name)
class ProtoWrapper(metaclass=MetaProtoWrapper):
class Meta:
protocol_buffer_type = Message
direction_in = ProtoWrapper.Direction.IN # OK
direction_in: ProtoWrapper.Direction = ProtoWrapper.Direction.IN # Name "ProtoWrapper.Direction" is not defined [name-defined]
Expected Behavior
ProtoWrapper.Direction should be a valid type
Actual Behavior
ProtoWrapper.Direction raises name-defined error
Your Environment
- Mypy version used:
mypy 1.10.0 (compiled: yes) - Mypy command-line flags: NA
- Mypy configuration options from
mypy.ini(and other config files): NA - Python version used: 3.12
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Führe die verknüpfte mypy-play-Reproduktion oder den Code im Issue aus, um den name-defined-Fehler bei einem von einer Metaklasse bereitgestellten Klassenattribut, das als Typ verwendet wird, zu bestätigen. Verfolge anhand dieser Reproduktion das relevante Verhalten von mypy und überprüfe anschließend, dass ProtoWrapper.Direction ohne den Fehler als Typ akzeptiert wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100