我最近开始使用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)
答案 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)
,而印刷并不喜欢这样的东西