如何检查嵌套抽象类的完整类型签名?在这个例子中。
因此,获取嵌套类型似乎并不直接。我在文档中找不到相关信息。
附言:我需要这个实现来进行多重分派。
更新
感谢Alexander Huszagh和Blender的反馈,我们现在知道Python 3.5中的抽象类(可能)有两个属性来存储嵌套类型:
In [4]: from typing import Sequence
In [5]: IntSeq = Sequence[int]
In [6]: isinstance([1], IntSeq)
Out[6]: True
In [7]: isinstance([1.0], IntSeq)
Out[7]: True
我希望最后一个isinstance
调用实际上返回False
,而它只检查参数是否为Sequence
。我考虑过递归地检查类型,但是IntSeq
没有公共属性来存储嵌套的类型:
In [8]: dir(IntSeq)
Out[8]:
['__abstractmethods__',
'__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__extra__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__le__',
'__len__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__origin__',
'__parameters__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__slots__',
'__str__',
'__subclasshook__',
'__weakref__',
'_abc_cache',
'_abc_negative_cache',
'_abc_negative_cache_version',
'_abc_registry']
因此,获取嵌套类型似乎并不直接。我在文档中找不到相关信息。
附言:我需要这个实现来进行多重分派。
更新
感谢Alexander Huszagh和Blender的反馈,我们现在知道Python 3.5中的抽象类(可能)有两个属性来存储嵌套类型:
__parameters__
和__args__
。前者在Linux(Ubuntu)和Darwin(OS X)下都存在,尽管在Linux下为空。后者仅在Linux下可用,并且像__parameters__
一样存储类型在OS X下。这些实现细节增加了混淆。