-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Closed
Labels
Description
After merging #18559 I think it would make sense to change how we check for @final
enums here:
Lines 2705 to 2727 in d4e7a81
def is_final_enum_value(self, sym: SymbolTableNode) -> bool: | |
if isinstance(sym.node, (FuncBase, Decorator)): | |
return False # A method is fine | |
if not isinstance(sym.node, Var): | |
return True # Can be a class or anything else | |
# Now, only `Var` is left, we need to check: | |
# 1. Private name like in `__prop = 1` | |
# 2. Dunder name like `__hash__ = some_hasher` | |
# 3. Sunder name like `_order_ = 'a, b, c'` | |
# 4. If it is a method / descriptor like in `method = classmethod(func)` | |
if ( | |
is_private(sym.node.name) | |
or is_dunder(sym.node.name) | |
or is_sunder(sym.node.name) | |
# TODO: make sure that `x = @class/staticmethod(func)` | |
# and `x = property(prop)` both work correctly. | |
# Now they are incorrectly counted as enum members. | |
or isinstance(get_proper_type(sym.node.type), FunctionLike) | |
): | |
return False | |
return self.is_stub or sym.node.has_explicit_value |
There's no need to duplicate the .enum_member
logic here once again. I will refactor this piece.