Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python3.8中,如何测试数据类中注释为Literal的字段在运行时是有效的_Python_Runtime_Literals_Typechecking_Python Dataclasses - Fatal编程技术网

在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()