Python中typing.Optional的类型是什么?

8

我想使用typing模块的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'

除了比较不太符合Python风格的repr之外,似乎没有通用的方法来判断类型是否为typing.Optional。有什么技巧可以解决吗?

附注:在3.7中,有typing._GenericAlias,它可以完美地工作。


这是一个命名不当的元类。只需使用 isinstance(typing.Optional[int], type(typing.Union)) 即可。 - juanpa.arrivillaga
@juanpa.arrivillaga 谢谢,非常有帮助! - Kevin Fang
3
这回答解决了您的问题吗?【检查字段是否是typing.Optional类型】(https://dev59.com/-VMI5IYBdhLWcg3wLYbE) - Tekill
1个回答

6

我认为这个问题已在这篇帖子中得到了回答 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)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接