所以我将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))
答案 0 :(得分:0)
如果我错了,请纠正我,但我相信可选函数参数*args
和**kwargs
的定义分别是类型tuple
和dict
。
我假设的原因是这些可选参数通过值传递 ,即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}}。