如何将我的自定义字典子类扩展到 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 分别是 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'}

因此,为了保留明确定义的行为,不允许设置 kwargstype 是完全合理的。