在Python3.8中,如何测试数据类中注释为Literal的字段在运行时是有效的
给出以下示例:在Python3.8中,如何测试数据类中注释为Literal的字段在运行时是有效的,python,runtime,literals,typechecking,python-dataclasses,Python,Runtime,Literals,Typechecking,Python Dataclasses,给出以下示例: 从输入import Literal开始 从数据类导入数据类 @数据类 课堂示例: 回答:字面上的['Y','N'] x=示例('N') 字段=字段(x)[0] 如何检查变量字段是否为Literal类型issubclass(field.type,Literal)似乎不起作用 其次,如何从字段中获取列表['Y','N']。键入,以便在运行时检查值,并在失败=示例('invalid')时引发错误 pydantic可以这样做,但您必须使用它们的数据类中的drop…Literal不是py
从输入import Literal开始
从数据类导入数据类
@数据类
课堂示例:
回答:字面上的['Y','N']
x=示例('N')
字段=字段(x)[0]
如何检查变量字段是否为Literal类型issubclass(field.type,Literal)
似乎不起作用
其次,如何从字段中获取列表['Y','N']
。键入
,以便在运行时检查值,并在失败=示例('invalid')时引发错误
pydantic
可以这样做,但您必须使用它们的数据类中的drop…Literal
不是python对象在运行时的正常类型,检查对象是否为Literal
您可以使用\uuuuu annotations\uuuu
访问类的注释,如下所示:
>>> Example.__annotations__['answer'].__args__
('Y', 'N')
为此,我创建了一个小型Python库: 此库可应用于保存另一个数据类(嵌套数据类)和嵌套容器类型(如
Tuple[List[Dict...
)的此类数据类。
当然,它可以在运行时测试
Literal
。谢谢你的回答,我最后用这个作为我的第一个问题:hasattr(field.type,''.'.'.''.'origin'.'')和getattr(field.type,'.'origin'.'')是Literal
如果类型是int/Decimal/str,那么你就可以执行issubclass(..)只是不适用于文本…而使用略短的手来获取后者:getattr(field,“\uuu args\uuu”)
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()