python 打字的类型是什么。可选

标签 python python-3.x

我想使用打字的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/

相关文章:

python-3.x - 修复将空列表分配给值 "DNA_Sequence"时出现的错误

windows - Windows 10 上的 Tensorflow 安装,错误 'Not a supported wheel on this platform'

python - 用鼠标指针移动 python turtle

python - 在保存中间值的同时多重映射一个值

python - os.times 返回值的第 5 位到底是什么意思?

python - 将 Access-Control-Allow-Origin 添加到 app.yaml

python - 如果单词在 Pandas 的特定列中,如何获取一 block 的次数?

python - 是否有更短的方法或 pythonic 方法来生成遵循使用 BeautifulSoup 模式的自定义 html?

python - 如何将多个目录中的图像复制到相应的多个目标目录中并调整它们的大小?

python-3.x - 根据时间列来回计数行