pythonドキュメンテーションは頻繁に「コンテナ」について話します。 E.g。 :
Check_circularがFalse(デフォルト:True)の場合、container typesの循環参照チェックはスキップされ、循環参照はOverflowErrorになります(または悪い)。
しかし、私はコンテナの公式の定義も、それらのリストも見つけることができません。
Python 2.7.3:
コンテナであるチェック済みの組み込み型:
(isinstance(object, collections.Container)
はTrue
を返します)
___contains__
_メソッドが定義されているコンテナ:
___contains__
_メソッドが定義されていないコンテナ:
コンテナではないチェック済みの組み込み型:
(isinstance(object, collections.Container)
はFalse
を返します):
isinstance(object, collections.Container)
でチェックした他の組み込みタイプを教えてください。リストに追加します。
コンテナは、任意の数の他のオブジェクトを保持するオブジェクトです。一般に、コンテナは、含まれるオブジェクトにアクセスし、それらを反復する方法を提供します。
コンテナの例には、Tuple
、list
、set
、dict
;などがあります。これらは、組み込みコンテナです。 collections
モジュールでは、より多くのコンテナタイプを使用できます。
厳密に言えば、 collections.abc.Container
抽象基本クラス(Python-2では collections.Container
)は、__contains__
magicメソッドを介してin
演算子をサポートするすべての型に適用されます。 x in y
を記述できる場合、y
は通常コンテナーですが、常にではありません:containersとgeneralの重要な違いiterablesは、反復されると、コンテナーが参照を保持する既存のオブジェクトを返しますが、ジェネレーターやfile
オブジェクトは、毎回新しいオブジェクトを作成します。これは、ガベージコレクションと深いオブジェクトトラバーサル(例:deepcopy
およびシリアル化)に影響します。
例として、iter(lambda: random.choice(range(6)), 0)
はin
演算子をサポートしますが、確かにnotコンテナーです!
Collections.abc.Container
マジックメソッドのみを考慮し、in
演算子をサポートする他の方法ではなく、__contains__
抽象基本クラスの意図は、真のコンテナが単一の操作で格納をテストし、内部状態を観察できるようにすることです。 Collections.abc.Container
は__contains__
を抽象メソッドとして定義するため、isinstance(x, collections.abc.Container)
then x
がin
演算子をサポートすることが保証されます。
実際には、すべてのコンテナに__contains__
マジックメソッドがあります。ただし、オブジェクトがコンテナであるかどうかをテストするときは、isinstance(x, collections.abc.Container)
を使用して明確にし、Container
サブクラスチェックが変更された場合の上位互換性を確保する必要があります。
http://docs.python.org/dev/library/collections.abc.html#module-collections.abc によると、コンテナの最も一般的な定義は、単に___contains__
_。一般に、Python "container"や "sequence"のような概念は抽象的に定義されていません;それらは振る舞いによって "アヒル型"です。つまり、コンテナはin
演算子がオン。
Pythonビルトインコンテナタイプは、Tuple、list、dict、set、frozenset、str、unicode(または、Python 3のバイトとstr)、および技術的には型ですが、特定のコンテキストの外部では一般的に使用されない他のいくつかの構造(バッファオブジェクトやxrangeオブジェクトなど)collections
モジュールで追加のコンテナ型が提供されます。
コンテナはすべてpython list
やdict
などの他のオブジェクトを含むオブジェクトです。Container
タイプはABCであり、インターフェイスのように動作します。コンテナは、__contains__
メソッドを実装するクラスです。
これが doc です