`Enum` plugin should support `unique` check where possible
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Feature
After https://github.com/python/mypy/pull/10852 is merged we can work on making @enum.unique to check for actually unique values.
Right now it does nothing. In other words, this code passes mypy check:
from enum import Enum, unique
@unique
class A(Enum):
x = 1
y = 1
But, fails in runtime:
Traceback (most recent call last):
File "ex.py", line 4, in <module>
class A(Enum):
File "/Users/sobolev/.pyenv/versions/3.8.9/lib/python3.8/enum.py", line 969, in unique
raise ValueError('duplicate values found in %r: %s' %
ValueError: duplicate values found in <enum 'A'>: y -> x
But, since after #10852 all fields would be implicitly final and their values will be inferred as Literal types, this gives us some space to check that we have unique literal values inside mypy/plugins/enums.py
Corner case
We should ignore any non-Literal values from this check:
def rand_int() -> int:
...
@unique
class A(Enum):
x = rand_int()
y = rand_int()
z = 0
This can even raise in runtime if x or y is 0, but we have no way of knowing this in advance.
Related #5599
Related #10857
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
Nachdem du die erforderlichen Vorarbeiten in #10852 bestätigt hast, beginne in mypy/plugins/enums.py und untersuche, wie die Werte von Enum-Feldern als Literal-Typen abgeleitet werden. Implementiere die @enum.unique-Prüfung auf doppelte Literal-Werte, wobei Nicht-Literal-Werte ignoriert werden, und überprüfe anschließend die im Issue beschriebenen Beispiele und den Sonderfall.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Feature
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 48/100