如何檢查嵌套抽象類的完整類型簽名?在這個例子中Python:遞歸isinstance檢查
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']
因此,它似乎並沒有很直接獲得嵌套類型。我無法在文檔中找到相關信息。
P.S. 我需要這個多重分派實現。
更新
感謝亞歷山大Huszagh和攪拌機的反饋,我們現在知道,抽象類在Python 3.5(可能)具有存儲嵌套類型的兩個屬性:__parameters__
和__args__
。前者在Linux(Ubuntu)和Darwin(OS X)下都有,儘管在Linux中它是空的。後者僅在Linux下可用,並在OS X下存儲類似__parameters__
的類型。此實現細節添加了混淆。
我希望近親選民解釋他的選擇:「有太多可能的答案,或者對於這種格式好的答案太長了,請添加詳細信息以縮小答案集或隔離一個問題可以在幾段中回答「。 –
'isinstance([「hello」],int_seq)'也是'True'。你確定你不是在創建一個更大的問題,而是嘗試使用打字而不是簡單的類型檢查來解決問題嗎? –
@DmitryTorba我想在Python中實現真正的多重分派,所以我需要分派器能夠檢查完整的類型簽名。 –