-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
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
Disallow access to instance variable via class #240
Comments
Actually, I'm no longer convinced that this is a bug. Turning this into an enhancement proposal. |
Yeah, this may just be a somewhat unconventional wy of setting the default. |
Postponing this as I'm not sure if this is a good idea but might still be worth considering. |
The OP has it as writing—I ran into this erroneously reading a variable; consider: from __future__ import annotations
import logging
from typing import Type
class A:
def __init__(self):
self._log = logging.getLogger()
pass
@classmethod
def from_spam(cls: Type[A], spam):
if spam:
cls._log.warning("got spam") # accepted, but should be an error
return cls() |
I ran into a situation which is almost the opposite problem of the original one: not only a given attribute is deliberately accessible by both the instance and the class, but the type in each case different. Unsurprisingly mypy complains about Minimal example: class A:
x = "a"
def __init__(self) -> None:
self.x = 1
assert A().x == 1
assert A.x == "a" I tried annotating class A:
x: int
x: ClassVar[str] = "a"
def __init__(self) -> None:
self.x = 1 |
Hello! With Python 3.12.6 and mypy 1.11.2, mypy says still nothing on this case, but Pylint and Pylance do it, and there is an error during the code execution. Plus, for this close similar case: class A:
id: Final[int] = 5
def __init__(self):
self.id = 10
a = A()
print(A.id) # => 5
print(a.id) # => 10
print(a.__class__.id) # => 5 mypy says Cannot assign to final attribute "id" mypy(misc) on the self.id = 10 line, which is incorrect because self.id defined in the constructor is considered as an instance attribute by Python, and not the class attribute A.id. :/ |
Currently an instance variable can be accessed using the class, which is wrong. For example, this code is accepted by the type checker:
Class variables need to be assigned in the class body:
The text was updated successfully, but these errors were encountered: