mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-04 02:38:25 +00:00
[ty] Support frozen dataclasses (#17974)
## Summary https://github.com/astral-sh/ty/issues/111 This PR adds support for `frozen` dataclasses. It will emit a diagnostic with a similar message to mypy Note: This does not include emitting a diagnostic if `__setattr__` or `__delattr__` are defined on the object as per the [spec](https://docs.python.org/3/library/dataclasses.html#module-contents) ## Test Plan mdtest --------- Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Carl Meyer <carl@astral.sh>
This commit is contained in:
parent
cb04343b3b
commit
01eeb2f0d6
2 changed files with 153 additions and 52 deletions
|
@ -369,7 +369,65 @@ To do
|
|||
|
||||
### `frozen`
|
||||
|
||||
To do
|
||||
If true (the default is False), assigning to fields will generate a diagnostic.
|
||||
|
||||
```py
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class MyFrozenClass:
|
||||
x: int
|
||||
|
||||
frozen_instance = MyFrozenClass(1)
|
||||
frozen_instance.x = 2 # error: [invalid-assignment]
|
||||
```
|
||||
|
||||
If `__setattr__()` or `__delattr__()` is defined in the class, we should emit a diagnostic.
|
||||
|
||||
```py
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class MyFrozenClass:
|
||||
x: int
|
||||
|
||||
# TODO: Emit a diagnostic here
|
||||
def __setattr__(self, name: str, value: object) -> None: ...
|
||||
|
||||
# TODO: Emit a diagnostic here
|
||||
def __delattr__(self, name: str) -> None: ...
|
||||
```
|
||||
|
||||
This also works for generic dataclasses:
|
||||
|
||||
```toml
|
||||
[environment]
|
||||
python-version = "3.12"
|
||||
```
|
||||
|
||||
```py
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class MyFrozenGeneric[T]:
|
||||
x: T
|
||||
|
||||
frozen_instance = MyFrozenGeneric[int](1)
|
||||
frozen_instance.x = 2 # error: [invalid-assignment]
|
||||
```
|
||||
|
||||
When attempting to mutate an unresolved attribute on a frozen dataclass, only `unresolved-attribute`
|
||||
is emitted:
|
||||
|
||||
```py
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class MyFrozenClass: ...
|
||||
|
||||
frozen = MyFrozenClass()
|
||||
frozen.x = 2 # error: [unresolved-attribute]
|
||||
```
|
||||
|
||||
### `match_args`
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue