我正在尝试编写一个函数装饰器,它使用 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
不能与 isinstance
或 issubclass
一起使用。
我找不到使用类型对象检查它的方法。我试图自己实施检查,但是 bark.__annotations__['descr']
typing.Union[int, str]
如果不使用丑陋的 hack,我无法在运行时访问类型列表检查 bark.__annotations__['descr'].__repr__()
。
有没有正确的方法来访问这些信息?还是故意在运行时不易访问?
原文由 Jacopofar 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
__args__
属性Union
包含tuple
的“可能内容:__args__
参数没有记录,所以它可以被认为是“混淆实现细节”,但它似乎是比解析repr
更好的方法。