Python自定义映射类**解包和'keys'属性

时间:2015-11-05 14:25:34

标签: python mapping unpack

我想使用SimpleNameSpace,它也可以作为映射,以便能够与**解包使用。

以下是我所做的:

class MySimpleNameSpace(object):
    # my initial attempt subclassed SimpleNameSpace and Mapping, with
    # possibility to use MySimpleNameSpace as a dict as well as a normal SimpleNameSpace.

    def __init__(self, **kw):
        self.__dict__.update(kw)

    def __getitem__(self, item):
        return getattr(self, item)

    def keys(self):
        return self.__dict__.keys()

到目前为止一切顺利:

def f(**kw):
    print(kw)

ns = MySimpleNameSpace(a=42)
f(**ns)

给予:{'a': 42}

更棘手:

ns.__getitem__ = "what"
ns.__iter__ = "da"
f(**ns)

现在给出:

{'a': 42, '__getitem__': "what", '__iter__', "da" }

可是:

ns.keys = "douh"
f(**ns)

显然给出了:

TypeError: attribute of type 'str' is not callable

任何想法是否可以使用这样的自定义映射类但是能够使用keys作为普通属性?

我意识到子类化(Mutable)Mapping使得它实际上更难,如果可能的话,但我认为这都是因为功能显然要求给定对象拥有keys方法,如果我们找不到解决办法,这是不幸的。

据我所知:迭代(__iter__)dict给出了它的键,然后__getitem__给出了与给定键相关的值。据我所知,这足以实现功能吗?

0 个答案:

没有答案