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

时间:2019-09-26 09:23:09

标签: python class kwargs

我最近开始使用Python进行编码,并且对** kwargs参数和类初始化有疑问。

对于以下类实例化和 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)

1 个答案:

答案 0 :(得分:3)

一些解释:

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),而印刷并不喜欢这样的东西