-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
no error when setting init=False
on Final
field in dataclass
#13119
Comments
There is no error either when the member is not final. IMO the whole premise is dubious when it comes to OO, having a parameter that you cannot initialize through the constructor and that has no value will result in an incomplete object. The solution could be to reject fields where |
Just checked, the error also occurs for normal classes: class Bar:
b: int
def __init__(self):
...
Bar().b # no error with mypy, obvious error at runtime |
i guess that's the same issue as #686 |
I don't think it is, this issue has to do with mypy being unable to determine if this variable can be initialized. I tried to fix this issue but it seems not trivial to resolve properly. Use cases like the one below show that the field can be initialized in methods like
|
What if we'd only flag the error if there is no |
I checked, but there are other use cases like this one: [case testDataclassesInitVarOverride]
# flags: --python-version 3.7
import dataclasses
@dataclasses.dataclass
class A:
a: dataclasses.InitVar[int]
_a: int = dataclasses.field(init=False)
def __post_init__(self, a):
self._a = a
@dataclasses.dataclass(init=False)
class B(A):
b: dataclasses.InitVar[int]
_b: int = dataclasses.field(init=False)
def __init__(self, b):
super().__init__(b+1)
self._b = b which are considered legitimate code (here: overriding |
Hi! I'm interested in working on this issue. I've spent some time trying to familiarize myself with I'm thinking that in Also, I'm also not exactly sure where the actual error would get thrown. I noticed that I'm new to this project so any guidance on this issue would be super helpful, thank you! |
@odesenfans I think the difference is that in the OP I found another case of high suspicion: from typing import Final
from dataclasses import dataclass, field
@dataclass
class Bar:
a: Final[int] = field()
b: Final[int]
def __init__(self) -> None:
self.a = 1 # error: Cannot assign to final attribute "a"
self.b = 1 This error is a sus imposter false positive. |
#14285 is an attempt at this, but unfortunately it at least currently seems too complex to merge as is. It would be great if somebody can come up with a simpler way to implement this functionality. #14285 is still a useful first step and the test cases can be useful, in particular (remember to credit @jakezych if you reuse parts of the PR). |
I think @JukkaL just meant to check for |
playground
related: #13118
The text was updated successfully, but these errors were encountered: