如何将我的自定义字典子类扩展到 python 中的函数参数
How do i expand my custom dict subclass into function arguments in python
所以我将 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))
如果我错了请纠正我,但我相信可选的函数参数 *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'}
因此,为了保留明确定义的行为,不允许设置 kwargs
的 type
是完全合理的。
所以我将 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))
如果我错了请纠正我,但我相信可选的函数参数 *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'}
因此,为了保留明确定义的行为,不允许设置 kwargs
的 type
是完全合理的。