в python 3.8, как проверить поле, помеченное как Литерал в классе данных, действительно при запуске - PullRequest
0 голосов
/ 25 апреля 2020

В следующем примере:

from typing import Literal
from dataclasses import dataclass
@dataclass
Class Example:
    answer: Literal['Y', 'N']

x = Example('N')
field = fields(x)[0]

Как проверить, что поле переменной имеет тип Literal? issubclass(field.type, Literal), похоже, не работает.

Во-вторых, как мне тогда получить list ['Y', 'N'] из field.type, чтобы я мог проверить значение во время выполнения и выдать ошибку, когда fail = Example('invalid')

pydantic делает это, но вам придется использовать их падение в классе данных ...

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Literal не является нормальным типом, который объект python будет иметь во время выполнения, нет смысла проверять, является ли объект Literal

. Вы можете получить доступ к аннотациям для класс, использующий __annotations__, следующий из вашего примера:

>>> Example.__annotations__['answer'].__args__
('Y', 'N')
0 голосов
/ 03 мая 2020
from dataclasses import dataclass
from typing import Literal

from validated_dc import ValidatedDC


@dataclass
class Example(ValidatedDC):
    answer: Literal['Y', 'N']


instance = Example('N')
assert instance.is_valid()


instance = Example('X')
assert not instance.is_valid()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...