new rule - assignment to instance variable from class
- Dominant language
- Rust
- Stars
- 7k
- Forks
- 516
- PR merge metrics
- No merged PRs in 30d
Description
pyrefly, ty and pyright all report an error when assigning to a `ClassVar` on an instance, but there should also be a rule for the opposite -- treating an instance variable like a `ClassVar`:
```py
from typing import ClassVar
class C:
class_var: ClassVar[int] = 1
instance_var: int
C.class_var = 3 # okay
C().class_var = 3 # error: Cannot assign to class variable
C().instance_var = 3 # okay
C.instance_var = 3 # no error (but should be)
```
pyrefly [already reports an error](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN0BhKKjhwAaqkoAdaehlT0AY2Gi6AIRExE89HT11lIuAH1UDBpUSCV4yQG1WDALo6dh1QGUArtgAUGuBgASm1ZfQMbU3NLTnR%2BOgBiOhhKahjsVEwAWlwANxTKCEwYEAAaEDJKGDAoUkIGWigKJIAFUiqa0jo0LDx8A1x0SDYvSjMIQcIFJI8YGDoAC3NiOEQAejXK6trCXjY1mHQ1zFxFODXFQeHR8cG1ujBeOlRc1GhUbFgBoYgRsYYJrpcMQAYM4FN0GQGAtBll8pQ4IC6ABeOhSEAAZkIAEYAEzohR2Aq8OAudBedBcHh8GDZTAQKqKAH5FF0ADkv3QvBgbIUXIYWSqAEcvAzaVkANYwUhZVCKRTwOCstkAd0k6F5lO4UAgiggAowXVRbOJlE1MHwxB1eoN6CN7NNmqp1v1tSyxUg6HFZgsEGwXgY82NjoUFK8gWynO5yrVlA1ofQVTlCw%2BX2Nsfj6BoEFErDYOXhhWK7pgl3%2BT3T6qd2t1%2Btl2DgFjlAvcSsrcbZIAAvuVmxB8gAxaAlRAgHo4AgkchdoA) when attempting to override a `ClassVar` with an instance variable:
```py
from typing import ClassVar
class Base:
class_attr: ClassVar[int]
class Sub(Base):
class_attr: int # error: bad-override
```
but this is only an issue if instance variables can't be treated as `ClassVar`s
also see discussion on ty: https://github.com/astral-sh/ty/issues/3721#issuecomment-4676128051
Contributor guide
Assessment
This issue has not been assessed yet.