gpt4 book ai didi

python - 在 Python 3.6 中运行时根据 Union 类型检查变量

转载 作者:太空狗 更新时间:2023-10-29 20:41:30 25 4
gpt4 key购买 nike

我正在尝试编写一个函数装饰器,它使用 Python 3.6 类型提示来检查参数字典是否遵守类型提示,如果没有引发错误并清楚地描述问题,则用于 HTTP API。

问题是当函数有一个使用 Union 类型的参数时,我无法在运行时根据它检查变量。

比如我有这个功能

from typing import Union
def bark(myname: str, descr: Union[int, str], mynum: int = 3) -> str:
return descr + myname * mynum

我能做到:

isinstance('Arnold', bark.__annotations__['myname'])

但不是:

isinstance(3, bark.__annotations__['descr'])

因为 Union 不能与 isinstanceissubclass 一起使用。

我找不到使用类型对象检查它的方法。我试图自己实现检查,但是 bark.__annotations__['descr'] 在 REPL 中显示为 typing.Union[int, str] 我不能在运行时访问类型列表,如果不使用检查 bark.__annotations__['descr'].__repr__() 的丑陋 hack。

是否有正确的方法来访问这些信息?还是有意使其在运行时不易访问?

最佳答案

在 Python 3.8 及更高版本中,MSeifert 建议的方法和 Richard Xia可以通过不使用未记录的属性 __origin____args__ 来改进。此功能由新函数提供 typing.get_args(tp)typing.get_origin(tp) :

>> from typing import Union, get_origin, get_args
>> x = Union[int, str]
>> get_origin(x), get_args(x)
(typing.Union, (<class 'int'>, <class 'str'>))
>> get_origin(x) is Union
True
>> isinstance(3, get_args(x))
True
>> isinstance('a', get_args(x))
True
>> isinstance([], get_args(x))
False

P.S.: 我知道这个问题是关于 Python 3.6 的(可能是因为这是当时最新的版本),但是当我作为 Python 3.8 用户搜索解决方案时,我来到了这里。我猜其他人可能处于同样的情况,所以我认为在这里添加一个新的答案是有道理的。

关于python - 在 Python 3.6 中运行时根据 Union 类型检查变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45957615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com