![](/img/trans.png)
[英]How to short*cirtcuit [] to create a list-like object instead of the standard list ? Is it even possible?
[英]Is there an official or common knowledge standard minimal interface for a “list-like” object?
我一直看到的功能和文檔像這樣和這個哪個操作或請參閱列表類似的對象 (僅舉幾例)。
我非常清楚實際列表是什么( dir(list)
),並且可以在大多數對“類似列表的對象”的引用中推斷出列表中的( 通常是變化的 )方法是必要的,但是次數我看到引用它給我留下了以下問題:
對於“類似列表”的對象,是否有官方或通用知識標准的最小接口? 它是否像實現__getitem__
一樣簡單,還是同意還需要__len__
和__setitem__
其他內容?
這可能看起來像語義,但我不禁想到,如果不存在標准的最小接口要求, “列表相似”的各種想法可能會導致一些問題/不當處理。 也許這只是Python的鴨子打字的一個小小的缺點?
請參閱collections.abc
模塊。 在那里列出的抽象基類list
,Python中的list
實現了Iterable
, Container
, Sized
, Sequence
和MutableSequence
。 現在,其中, Iterable
, Sequence
和MutableSequence
可以隨便稱為列表式 。
不過,我想知道,這個術語列表類似的意思,這是一個MutableSequence
-至少有方法__getitem__
, __setitem__
, __delitem__
和__len__
,也期待它有文檔中提到的混合料攪拌的方法,如append
。
如果不需要__setitem__
和__delitem__
則應該將其稱為序列 - 假設如果某些東西接受了序列,則它不需要是可變的,因此str
, bytes
, tuple
等也可以在那里工作。
您的兩個鏈接突出了該術語的模糊性:
繪圖API要求list-like
對象將被內部PlotlyJSONEncoder
序列化為JSON數組,該內部PlotlyJSONEncoder
將大部分編碼委托給Python JSONEncoder
。 但是,后者只將tuple
和list
(和子類)編碼為JSON數組; 因此列表類似的在這里是指一個list
,一個tuple
或亞類的化合物。 不是任何子類的自定義序列對象將導致TypeError: [...] is not JSON serializable
。
您鏈接到的解壓縮配方需要一個行為類似於Sequence
的對象(不需要可變性),因此一個tuple
或str
,或任何實現Sequence
自定義對象都會在那里執行。
TL; DR 列表是一個含糊的術語。 最好使用術語iterable,sequence和mutable sequence,現在這些是在collections.abc
中定義的。
“類似列表的對象”的技術術語是序列 。 至少它支持排序(即具有相同元素但不同順序的兩個對象不相等),索引( foo[bar]
使得bar
是小於序列長度的整數),以及包含檢查( in
) ,並具有給定的長度。 它應該支持迭代,但如果沒有,那么Python將使用索引來模擬它。
幾乎每當你在Python文檔中看到“類似對象”時,作者都是故意模糊的。 作者已經決定枚舉所有必需的接口會很麻煩,並且只是說它的某些接口是必需的。 實現所有接口的對象保證可以工作,但在大多數情況下,它將使用實現更少的對象。
使用“類似列表的對象”可能是您可以做的最好的事情,而不是檢查源代碼,是推斷它是否需要任何可變接口。 如果它只需要對列表的只讀訪問權限,那么您可以非常確定不需要實現任何可變序列操作。
如果它說“list-like object or iterator”,你可以提供一些實現更簡單的迭代器接口的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.