[英]How does isinstance work for List?
我試圖理解Python的類型注釋是如何工作的(例如List
和Dict
- not list
or dict
)。 具體來說,我對isinstance(list(), List)
如何工作感興趣,這樣我就可以創建自己的自定義注釋。
我看到List
被定義為:
class List(list, MutableSequence[T], extra=list):
. . .
我熟悉metaclass = xxx
但我找不到有關此extra = xxx
任何文檔。 這是一個關鍵字還是一個參數,如果是這樣的話,它來自哪里,它會做我想要的事情? 是否與isinstance
相關?
isinstance()
和issubclass()
在object.__instancecheck__()
和object.__subclasscheck__()
中有掛鈎 , typing
泛型也使用。
如果你想提供自己的泛型,你真的想學習typing
模塊源代碼 ,特別是如何使用GenericMeta
和Generic
來定義其他通用類型,如List
; 大多數此類檢查都委托給abc.ABCMeta.__subclasshook__
。 您可以使用這樣的鈎子定義自己的ABC,然后定義一個子類化它的Generic。
這里的GenericMeta
元類也給出了extra
關鍵字參數含義。 這樣的內部結構仍然很少被記錄,因為typing
實現仍在不斷變化,該模塊仍然是臨時的 。 extra
參數存儲為__extra__
,用於自定義__subclasshook__
實現 ; 對於extra=list
它簡單地歸結為將isinstance(something, List)
為isinstance(something, list)
。
請注意,對運行時檢查的支持是故意限制的; 靜態類型檢查器實際上不會運行這些鈎子。 請參閱mypy跟蹤器中的結構子類型討論 ,以進一步討論開發人員如何考慮如何為復雜的自定義類提供更好的支持,這些自定義類可能會或可能不會實現足以被視為映射或序列或類似的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.