如何正确地检查一个对象是否为 typing.Generic?
如何正确地检查一个对象是否为 typing.Generic?
我正在尝试编写验证类型提示的代码,为了做到这一点,我必须找出注释是什么类型的对象。例如,考虑这个代码片段,它应该告诉用户期望的值是什么类型:
import typing typ = typing.Union[int, str] if issubclass(typ, typing.Union): print('value type should be one of', typ.__args__) elif issubclass(typ, typing.Generic): print('value type should be a structure of', typ.__args__[0]) else: print('value type should be', typ)
这应该打印出 "value type should be one of (int, str)",但实际上它抛出了一个异常:
Traceback (most recent call last): File "untitled.py", line 6, inif issubclass(typ, typing.Union): File "C:\Python34\lib\site-packages\typing.py", line 829, in __subclasscheck__ raise TypeError("Unions cannot be used with issubclass().") TypeError: Unions cannot be used with issubclass().
isinstance
也不起作用:
>>> isinstance(typ, typing.Union) Traceback (most recent call last): File "", line 1, in File "C:\Python34\lib\site-packages\typing.py", line 826, in __instancecheck__ raise TypeError("Unions cannot be used with isinstance().") TypeError: Unions cannot be used with isinstance().
正确的方法是如何检查 typ
是否为 typing.Generic
?
如果可能的话,我希望看到一个有文档支持、PEP或其他资源支持的解决方案。 通过访问未记录的内部属性来实现的"解决方案"很容易找到。但更有可能的是,它将被证明是一个实现细节,将在将来的版本中发生变化。我正在寻找"正确的方法"来实现它。