我如何将自定义dict子类扩展为python中的函数参数

时间:2019-09-06 08:04:39

标签: python function dictionary subclass

所以我将python dict继承为仅允许某些字段使用,以便将其用作选项映射。当我在函数调用中解压缩它时,我希望函数内部的自定义字典类型仍然是我的子类。

例如

#!/usr/bin/env python3

class Options(dict):

    _keys = ['a', 'b', 'c']

    def __init__(self, **kwargs):

        for key, val in kwargs.items():
            if key not in self._keys:
                raise KeyError

        super().__init__(self, **kwargs)

    def __setitem__(self, key, val):
        if key not in self._keys:
            raise KeyError
        else:
            super().__setitem__(self, key, val)


def foo(**kwargs):
    print(type(kwargs))


if __name__ == '__main__':
    options = Options(a=1, b=2, c=3)
    print(type(options))
    foo(**options)

输出:

<class '__main__.Options'>
<class 'dict'>

我想要的是foo内部的kwargs类型为Options。 这可能不弄乱python内部结构吗? 我想我可以不用拆包就能做,但是我喜欢具有一致的IO语法。

谢谢

编辑:

我通过以下方法解决了这个问题:

def foo(**kwargs):
    kwargs = Options(**kwargs)
    print(type(kwargs))

1 个答案:

答案 0 :(得分:0)

如果我错了,请纠正我,但我相信可选函数参数*args**kwargs的定义分别是类型tupledict

我假设的原因是这些可选参数通过值传递 ,即Python在该函数中使用了本地副本。参见示例:

class MyDict(dict):

    def __init__(self, **kwargs):
        super().__init__(self, **kwargs)


def test(**kwargs) -> None:
    kwargs['a'] = 'b'
    print(kwargs)


d = MyDict(a='a')
print(d)
test(**d)
print(d)

结果:

{'a': 'a'}
{'a': 'b'}
{'a': 'a'}

因此,为了保留定义良好的行为,完全可以避免设置type的{​​{1}}。