Поиск имени подсказки типа атрибутов класса данных

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

from dataclasses import dataclass

PositiveFloatType = NewType("PositiveFloat", float)

@dataclass(init=False, frozen=True)
class Foo:
    bar: PositiveFloatType = 1

Во время выполнения я бы хотел перейти к типу Foo.bar. То есть, я бы хотел найти все атрибуты класса Foo и узнать имена их типов, в случае Foo.bar - получить PositiveFloatType.

Я попытался использовать inspect, но безрезультатно. Есть какой-либо способ сделать это?


person IBS    schedule 11.11.2020    source источник


Ответы (2)


Для этого модуль dataclasses предоставляет функцию fields для:

from dataclasses import fields

for f in fields(Foo):
    print(f.name, f.type.__name__)
person deceze♦    schedule 11.11.2020
comment
Просто предупреждение, f.type будет строкой, если вы используете from __future__ import annotations где угодно. - person wKavey; 11.11.2020
comment
Не где-нибудь, а внутри того файла, который определяет класс данных. И да, поскольку в скором времени это будет поведением по умолчанию, ваш код должен этого ожидать. - person deceze♦; 11.11.2020
comment
Абсолютно правильно, спасибо за разъяснения - person wKavey; 11.11.2020

В качестве альтернативы, принимая во внимание тот факт, что f.type может быть строкой, и я предполагаю, что вам действительно нужен конкретный объект класса.

from typing import Any, Type, get_type_hints

def get_field_type(data_class: Type[Any], field_name: str) -> Type[Any]:
   return get_type_hints(data_class)[field_name]   
person wKavey    schedule 11.11.2020