Как проверить все ClassVar внутри класса?

#python #python-typing #class-variables

Вопрос:

У меня есть класс Python, подобный приведенному ниже:

 from typing import ClassVar

class Foo:
    bar: ClassVar[int] = 1
    
    def __init__(self):
        self.spam: int = 2
 

Как я могу проверить этот класс Foo , чтобы получить ClassVar s и их значения?

Я ищу что-то подобное {"bar": 1} , и мне нужно, чтобы это работало для Python 3.8 .

Ответ №1:

Вы можете сделать это, просмотрев __annotations__ словарь класса.

 from typing import ClassVar

class Foo:
    bar: ClassVar[int] = 1

    def __init__(self):
        self.spam: int = 2

for attr, cls in Foo.__annotations__.items():
    print(f'{attr=}, {cls=}, value={getattr(Foo, attr)}')
 

Выход:

 attr='bar', cls=typing.ClassVar[int], value=1
 

Ответ №2:

Ввод текста здесь кажется совершенно неуместным. В любом случае, чтобы получить атрибуты объекта, вы всегда можете попытаться проверить пространство имен объекта. Для объекта класса,

 vars(Foo)
 

Сработало бы. Однако имейте в виду, что это вернет буквальное пространство имен, поэтому, если вы хотите изменить этот диктант независимо от класса, вам необходимо создать копию. В данном случае простая неглубокая копия:

 dict(vars(Foo))
 

Было бы достаточно.