До Python 3.14 я мог сделать это:
Код: Выделить всё
class C:
foo: int
bar: int
__slots__ = (*__annotations__,)
not_a_slot: ClassVar[str] = 'some class variable'
Код: Выделить всё
@dataclass(slots=True)Есть ли совместимый с 3.8, но перспективный способ получить __slots__ на основе некоторого подмножества аннотированных атрибутов, но без повторения имен?
Единственное обходное решение, которое я нашел, - это сделать декоратор класса, который создает класс с установленным __slots__, таким образом:
Код: Выделить всё
from typing import ClassVar, get_origin
try:
from inspect import get_annotations
except ImportError:
def get_annotations(x):
return x.__annotations__
def annotations_to_slots(klass):
class Out(klass):
__slots__ = tuple(
name
for name, declared_type in get_annotations(klass).items()
if get_origin(declared_type) is not ClassVar
)
Out.__name__ = klass.__name__
try:
Out.__doc__ = klass.__doc__
except AttributeError:
pass
return Out
@annotations_to_slots
class C:
__slots__ = () # will be filled in by @annotations_to_slots
foo: int
bar: int
not_a_slot: ClassVar[str] = 'not a slot'
Есть ли лучший подход?
Подробнее здесь: https://stackoverflow.com/questions/798 ... n-3-8-3-14
Мобильная версия