Цель состоит в том, чтобы гарантировать неизменяемость экземпляра с помощью средства проверки типов и использовать обычный класс данных во время выполнения. Вот фрагмент:
Код: Выделить всё
from dataclasses import dataclass
from typing import TYPE_CHECKING
from functools import partial
if TYPE_CHECKING:
frozen = partial(dataclass, frozen=True)
else:
frozen = dataclass
@frozen
class Foo:
x: int
y: int
foo = Foo(1, 2) # mypy complains about the number of arguments
foo.x = 3 # instead, mypy should complain here
Код: Выделить всё
foo.py:49: error: Too many arguments for "Foo" [call-arg]
Код: Выделить всё
@dataclass(frozen=True)
class Foo:
x: int
y: int
foo = Foo(1, 2)
foo.x = 3 # mypy correctly catches the error here
P.S: Это всего лишь упражнение. Я знаю, что включить dataclass(frozen=True) намного проще, и в таких случаях мне не следует беспокоиться о производительности. Я был вдохновлен попробовать это после прочтения сообщения в блоге Тина Твртковича о том, как заморозить экземпляры класса attr во время компиляции.
Подробнее здесь: https://stackoverflow.com/questions/777 ... -in-python