簡體   English   中英

對於“類似列表”的對象,是否有官方或通用知識標准的最小接口?

[英]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實現了IterableContainerSizedSequenceMutableSequence 現在,其中, IterableSequenceMutableSequence可以隨便稱為列表式

不過,我想知道,這個術語列表類似的意思,這是一個MutableSequence -至少有方法__getitem____setitem____delitem____len__ ,也期待它有文檔中提到的混合料攪拌的方法,如append

如果不需要__setitem____delitem__則應該將其稱為序列 - 假設如果某些東西接受了序列,則它不需要是可變的,因此strbytestuple等也可以在那里工作。


您的兩個鏈接突出了該術語的模糊性:

繪圖API要求list-like對象將被內部PlotlyJSONEncoder序列化為JSON數組,該內部PlotlyJSONEncoder將大部分編碼委托給Python JSONEncoder 但是,后者只將tuplelist (和子類)編碼為JSON數組; 因此列表類似的在這里是指一個list ,一個tuple或亞類的化合物。 不是任何子類的自定義序列對象將導致TypeError: [...] is not JSON serializable

您鏈接到的解壓縮配方需要一個行為類似於Sequence的對象(不需要可變性),因此一個tuplestr ,或任何實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM