如何正确地检查一个对象是否为 typing.Generic?

10 浏览
0 Comments

如何正确地检查一个对象是否为 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, in 
    if 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或其他资源支持的解决方案。 通过访问未记录的内部属性来实现的"解决方案"很容易找到。但更有可能的是,它将被证明是一个实现细节,将在将来的版本中发生变化。我正在寻找"正确的方法"来实现它。

0