4

辞書をテストするさまざまな方法があるのはなぜですか? オブジェクトが辞書かどうかをテストする最も現代的な方法は何でしょうか?

adict = {'a': 1}

In [10]: isinstance(adict, types.DictType)
Out[10]: True

In [11]: isinstance(adict, types.DictionaryType)
Out[11]: True

In [12]: isinstance(adict, dict)
Out[12]: True

In [13]: isinstance(adict, collections.Mapping)
Out[13]: True

In [14]: isinstance(adict, collections.MutableMapping)
Out[14]: True
4

2 に答える 2

10

types.DictTypetypes.DictionaryTypeは非推奨 (まあ、Python 3 で削除された) のエイリアスですdict

collections.Mappingおよびcollections.MutableMapping抽象基本クラス (ABC) であるため、 からサブクラス化されていないマッピングで機能しdictます。通常、それはより良い選択になりますが、非常にまれに、より厳密な型チェックが役立つ場合があります。

基本的には順番にチェックしていきます

  • できればどれも(アヒル型)

  • collections.Mapping突然変異が必要ない場合

  • collections.MutableMapping突然変異が必要な場合

  • dict実際に型にする必要がある場合dict(これはまれなはずです)

  • types.DictTypeまたは、本当に古いバージョンtypes.DictionaryTypeをサポートしたい場合

于 2014-04-26T01:12:50.837 に答える
2

まず、types.DictTypetypes.DictionaryType、およびdictはすべて同じです (ドキュメントには、最初の 2 つは のエイリアスであることが事実上記されていますdict)。

最後の 2 つは抽象基本クラスであり、実際にTrueはまったく継承しないオブジェクトをテストしますdictこれらは、オブジェクトがdict-likeかどうか、つまり、同じ種類の操作を実装しているかどうかをテストする場合に使用されますdict。それらはわずかに異なります。Mappingは一般的なマッピング (不変の可能性がある)用ですが、MutableMappingは厳密には変更可能なマッピング用です。

于 2014-04-26T01:13:17.873 に答える