Feature
After #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
Feature
After #10852 is merged we can work on making
@enum.uniqueto check for actually unique values.Right now it does nothing. In other words, this code passes
mypycheck:But, fails in runtime:
But, since after #10852 all fields would be implicitly
finaland their values will be inferred asLiteraltypes, this gives us some space to check that we haveuniqueliteral values insidemypy/plugins/enums.pyCorner case
We should ignore any non-
Literalvalues from this check:This can even raise in runtime if
xoryis0, but we have no way of knowing this in advance.Related #5599
Related #10857