dict をサブクラス化せずに、クラスをマッピングと見なして、メソッドに渡すことができるようにするには何が必要ですか**
。
from abc import ABCMeta
class uobj:
__metaclass__ = ABCMeta
uobj.register(dict)
def f(**k): return k
o = uobj()
f(**o)
# outputs: f() argument after ** must be a mapping, not uobj
少なくとも、マッピングの機能が不足しているというエラーがスローされるので、実装を開始できます。
コンテナ タイプのエミュレーションを確認しましたが、単にマジック メソッドを定義しても効果はなく、 を使用してABCMeta
オーバーライドして辞書として登録すると、サブクラスとしてアサーションが検証されますが、失敗しますisinstance(o, dict)
。理想的には、 を使用したくありませんABCMeta
。
ベストアンサー1
__getitem__()
およびメソッドkeys()
で十分です:
>>> class D:
def keys(self):
return ['a', 'b']
def __getitem__(self, key):
return key.upper()
>>> def f(**kwds):
print kwds
>>> f(**D())
{'a': 'A', 'b': 'B'}