在初始化 class 时,我如何知道 **kwargs 参数中存储了哪些参数?

How do I know what arguments are stored in the **kwargs parameter when initalizing a class?

我最近开始在 Python 中编码,我对 **kwargs 参数和 class 初始化有疑问。

在下面的class实例化和init方法的情况下,我怎么知道**kwargs中存储了什么?在这种情况下,'net' 是包含不同键的 python 字典。这些键是否加载到 **kwargs 参数中?此外,如果我尝试在 init 方法中打印 **kwargs,它不会向 python 控制台输出任何打印,这是为什么?我不允许在 init 方法中打印吗?

谢谢。

''' instantiation '''    
    sf = op.algorithms.StokesFlow(network=net, phase=water)


''' __init__ method of the StokesFlow class '''
    def __init__(self, settings={}, phase=None, **kwargs):
        def_set = {'phase': None,
                   'quantity': 'pore.pressure',
                   'conductance': 'throat.hydraulic_conductance',
                   'gui': {'setup':        {'phase': None,
                                            'quantity': '',
                                            'conductance': ''},
                           'set_rate_BC':  {'pores': None,
                                            'values': None},
                           'set_value_BC': {'pores': None,
                                            'values': None},
                           'set_source':   {'pores': None,
                                            'propname': ''}
                           }
                   }
        print("kwargs:", **kwargs)
        super().__init__(**kwargs)
        self.settings.update(def_set)
        self.settings.update(settings)
        if phase is not None:
            self.setup(phase=phase)

一些解释:

kwargs 是一个命令。 Kwargs 捕获未在函数签名中单独指定的命名参数。 ** 表示字典正在解压。 (Explanation on unpacking is here)

你什么也得不到,因为你可能没有向那个函数传递任何东西。

def fun1(**kwargs):
    print(kwargs)

fun1() -> 打印 {}

fun1(1) -> 错误,TypeError: fun1() takes 0 positional arguments but 1 was given

fun1(a=1) -> {'a': 1}

当您像在代码中那样执行 print(**kwargs) 时会发生什么?

第一个示例不会打印任何内容(空字典解压为空):print(**{}) == print()

最后一个例子会中断。因为 print(**{'a': 1}) == print(a=1) 并且打印不喜欢那样的东西