Python 3.7即将到来,我想测试一些奇特的新dataclass+打字功能.使用本机类型和typing模块中的类型,可以很容易地获得正确工作的提示:
>>> import dataclasses
>>> import typing as ty
>>>
... @dataclasses.dataclass
... class Structure:
... a_str: str
... a_str_list: ty.List[str]
...
>>> my_struct = Structure(a_str='test', a_str_list=['t', 'e', 's', 't'])
>>> my_struct.a_str_list[0]. # IDE suggests all the string methods :)
Run Code Online (Sandbox Code Playgroud)
但是我想要尝试的另一件事是在运行时强制类型提示作为条件,即不应该dataclass存在具有不正确类型的类型.它可以很好地实现__post_init__:
>>> @dataclasses.dataclass
... class Structure:
... a_str: str
... a_str_list: ty.List[str]
...
... def validate(self):
... ret = True
... for field_name, field_def in self.__dataclass_fields__.items():
... actual_type = type(getattr(self, …Run Code Online (Sandbox Code Playgroud) 假设我有一个 python 函数,它的单个参数是一个非平凡类型:
from typing import List, Dict
ArgType = List[Dict[str, int]] # this could be any non-trivial type
def myfun(a: ArgType) -> None:
...
Run Code Online (Sandbox Code Playgroud)
...然后我有一个从 JSON 源中解压出来的数据结构:
import json
data = json.loads(...)
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何检查在运行时是data有正确的类型被用作论据来myfun()使用它作为一个参数之前myfun()?
if not isCorrectType(data, ArgType):
raise TypeError("data is not correct type")
else:
myfun(data)
Run Code Online (Sandbox Code Playgroud)