我想使用打字的get_type_hints
获取参数注释的方法。然而我在Python3.6.8
a = typing.Optional[int]
type(a)
Out[13]: typing.Union
type(a) == typing.Union
Out[14]: False
type(a) == type(typing.Optional)
Out[23]: False
type(a) == type(typing.Optional[int])
Out[24]: True
repr(type(a))
Out[25]: 'typing.Union'
repr(typing.Union)
Out[26]: 'typing.Union'
似乎没有通用的方法来判断类型是否是 typing.Optional
或者除了比较 repr
之外这不是很Pythonic。有破解吗?
附注3.7 中有 typing._GenericAlias
它工作得很好。
最佳答案
我相信这个问题在这篇文章 Check if a field is typing.Optional 中得到了解答。 .
我也将其粘贴在下面:
Optional[X]
相当于 Union[X, None]
。所以你可以这样做,
import re
from typing import Optional
from dataclasses import dataclass, fields
@dataclass(frozen=True)
class TestClass:
required_field_1: str
required_field_2: int
optional_field: Optional[str]
def get_optional_fields(klass):
class_fields = fields(klass)
for field in class_fields:
if (
hasattr(field.type, "__args__")
and len(field.type.__args__) == 2
and field.type.__args__[-1] is type(None)
):
# Check if exactly two arguments exists and one of them are None type
yield field.name
print(list(get_optional_fields(TestClass)))
关于python 打字的类型是什么。可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55152874/