首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >typing.Optional的类型是什么?

typing.Optional的类型是什么?
EN

Stack Overflow用户
提问于 2019-03-13 23:53:15
回答 1查看 7.9K关注 0票数 8

我想使用类型的get_type_hints方法来获得参数注释。然而,我在Python3.6.8中遇到了这个问题

代码语言:javascript
复制
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之外。有黑客入侵吗?

在3.7中有typing._GenericAlias,它工作得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-30 16:43:49

我相信这个问题已经在Check if a field is typing.Optional的帖子中得到了解答。

我还把它贴在下面:

Optional[X]等同于Union[X, None]。所以你可以这么做,

代码语言:javascript
复制
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)))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55152874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档