web-dev-qa-db-ja.com

Pythonの「コンテナ」とは正確には何ですか? (そして、pythonコンテナタイプは何ですか?)

pythonドキュメンテーションは頻繁に「コンテナ」について話します。 E.g。

Check_circularがFalse(デフォルト:True)の場合、container typesの循環参照チェックはスキップされ、循環参照はOverflowErrorになります(または悪い)。

しかし、私はコンテナの公式の定義も、それらのリストも見つけることができません。

編集

Python 2.7.3:

コンテナであるチェック済みの組み込み型:

isinstance(object, collections.Container)Trueを返します)

  1. ___contains___メソッドが定義されているコンテナ:

    • すべての組み込みシーケンスタイプ:リスト、バイト配列、文字列、Unicode文字列、およびタプル。
    • 辞書
    • すべての組み込みセットタイプ:セットとfrozensets
  2. ___contains___メソッドが定義されていないコンテナ:

    • xrangeオブジェクト

コンテナではないチェック済みの組み込み型:

isinstance(object, collections.Container)Falseを返します):

  • Intオブジェクト
  • フロートオブジェクト
  • 長いオブジェクト
  • ブールオブジェクト
  • モジュールオブジェクト
  • ファイルオブジェクト
  • バッファオブジェクト
  • Noneオブジェクト

isinstance(object, collections.Container)でチェックした他の組み込みタイプを教えてください。リストに追加します。

53
Bentley4

コンテナは、任意の数の他のオブジェクトを保持するオブジェクトです。一般に、コンテナは、含まれるオブジェクトにアクセスし、それらを反復する方法を提供します。

コンテナの例には、Tuplelistsetdict;などがあります。これらは、組み込みコンテナです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 xin演算子をサポートすることが保証されます。

実際には、すべてのコンテナに__contains__マジックメソッドがあります。ただし、オブジェクトがコンテナであるかどうかをテストするときは、isinstance(x, collections.abc.Container)を使用して明確にし、Containerサブクラスチェックが変更された場合の上位互換性を確保する必要があります。

79
ecatmur

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モジュールで追加のコンテナ型が提供されます。

5
BrenBarn

コンテナはすべてpython listdictなどの他のオブジェクトを含むオブジェクトです。ContainerタイプはABCであり、インターフェイスのように動作します。コンテナは、__contains__メソッドを実装するクラスです。

これが doc です

0
NoZip