facebook / facebook/pyrefly

new rule - assignment to instance variable from class

Open
#3,750 2 comments 0 reactions 1 assignee Claimed by @nitishagar View on GitHub
typechecking
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.