2011-12-22 48 views
49

沒有子字典,將一個類需要考慮的映射是什麼,這樣可以傳遞給方法有**蟒蛇類作爲映射**拆包

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。

回答

66

__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'} 
19

如果你想創建一個映射 - 不只是滿足傳遞給函數的要求 - 那麼你真的應該從collections.Mapping繼承。正如documentation描述,你只是需要實現:

__getitem__ 
__len__ 
__iter__ 

mixin將實現一切你:__contains__keysitemsvaluesget__eq____ne__

+0

超出範圍,但具有相關性和信息性,謝謝你 – dskinner 2011-12-23 17:26:14