Skip to content

Commit

Permalink
Fix "not callable" issue for @dataclass(frozen=True) with Final a…
Browse files Browse the repository at this point in the history
…ttr (#18572)

Closes #18567 

We should allow inferenced `a: Final = 1`
  • Loading branch information
sobolevn authored Feb 5, 2025
1 parent 75a4bc4 commit ac921ae
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
2 changes: 2 additions & 0 deletions mypy/plugins/dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,8 @@ def _freeze(self, attributes: list[DataclassAttribute]) -> None:
if sym_node is not None:
var = sym_node.node
if isinstance(var, Var):
if var.is_final:
continue # do not turn `Final` attrs to `@property`
var.is_property = True
else:
var = attr.to_var(info)
Expand Down
23 changes: 23 additions & 0 deletions test-data/unit/check-dataclasses.test
Original file line number Diff line number Diff line change
Expand Up @@ -2553,3 +2553,26 @@ class X(metaclass=DCMeta):
class Y(X):
a: int # E: Covariant override of a mutable attribute (base class "X" defined the type as "Optional[int]", expression has type "int")
[builtins fixtures/tuple.pyi]


[case testFrozenWithFinal]
from dataclasses import dataclass
from typing import Final

@dataclass(frozen=True)
class My:
a: Final = 1
b: Final[int] = 2

reveal_type(My.a) # N: Revealed type is "Literal[1]?"
reveal_type(My.b) # N: Revealed type is "builtins.int"
My.a = 1 # E: Cannot assign to final attribute "a"
My.b = 2 # E: Cannot assign to final attribute "b"

m = My()
reveal_type(m.a) # N: Revealed type is "Literal[1]?"
reveal_type(m.b) # N: Revealed type is "builtins.int"

m.a = 1 # E: Cannot assign to final attribute "a"
m.b = 2 # E: Cannot assign to final attribute "b"
[builtins fixtures/tuple.pyi]

0 comments on commit ac921ae

Please sign in to comment.