2017-11-16 13 views
3

Pythonでカスタムクラスのキーワード引数のアンパックをサポートするためには何が必要ですか?互換性のない型を展開しようとすると、次のエラーメッセージが与えられているのPython 2.7とPython 3.6通訳の両方で:キーワード引数のアンパックに関する要件

>>> dict(**None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: type object argument after ** must be a mapping, not NoneType 

マッピングは、オブジェクトが、具体的collections.Mappingをサブクラス化しなければならないということですか?または、マッピングの場合はなどの擬似タイプのいずれかcollections.Iterableを明示的にサブクラス化してiter()をサポートする必要はありません。この動作はPython 2と3で異なりますか?

答えて

3

マッピングは、キーと値のペアを関連付けるための包括的なコンテナです。

辞書アンパックを使用するには、collections.Mappingから継承することは必須ではありません。さらに、collections.Mappingは抽象クラスであるため、サブクラスのいずれかでdict展開を使用できるようにするには、まだいくつかのメソッドをオーバーライドする必要があります。面白い

class D(object): 
    def __getitem__(self, key): 
     return 2 

    def keys(self): 
     return ['1','2','3'] 

print(dict(**D())) 
# {'1': 2, '2': 2, '3': 2} 
+0

:クラスがキーを指定された値を返すようにkeys方法及び対応する__getitem__メソッドを実装するためのクラスのインスタンスのために

辞書アンパック、それが十分であることにします。 'keys'は、' __iter__'を実装するのに十分ではないことに驚いています。 –

+0

'__iter__'は、反復子プロトコルを実装し、マッピングに制限されていないオブジェクトの方が一般的です。マップはキーを与えられた値を返すことができなければならず、 '__getitem__'はそれを行います。 –

0

ここmappingためのPython glossary entryある:

任意のキー検索をサポートし、マッピング又はMutableMapping抽象基底クラスで指定されたメソッドを実装するコンテナオブジェクト。たとえば、dict、collections.defaultdict、collections.OrderedDict、collections.Counterなどがあります。

関連する問題