Python中向类传递关键字参数时kwargs为空的问题排查
**kwargs接收为空的问题原因及解决方法
问题原因
你传递的extra_args字典中包含了MainConsumer.__init__已经显式定义的参数varC和varD。Python处理关键字参数时,会优先将匹配显式参数名的键值对绑定到对应形参,只有不在显式参数列表中的键才会被收集到**kwargs里。
你的场景中:
varC、varD会直接赋值给MainConsumer的同名形参,不会进入kwargs- 只有
varE会被收集到kwargs,如果你的varE是None或未传入有效值,就会出现kwargs为空的情况
正确传递方式
方式1:拆分显式参数与额外参数
单独传递MainConsumer定义的显式参数,把需要进入kwargs的参数单独作为关键字参数传递:
class MyTestConsumer(object): def __init__(self, varA, varB, varC, varD=None, varE=None): self.varA = varA self.varB = varB # 直接传递显式参数,单独传入varE到kwargs self.some_consumer = MainConsumer(varA, varB, varC=varC, varD=varD, varE=varE)
方式2:拆分字典后合并传递
将extra_args拆分为显式参数字典和额外参数字典,再合并传递:
class MyTestConsumer(object): def __init__(self, varA, varB, varC, varD=None, varE=None): self.varA = varA self.varB = varB # 分离显式参数和需要进入kwargs的参数 explicit_args = {"varC": varC, "varD": varD} extra_kwargs = {"varE": varE} # 合并传递 self.some_consumer = MainConsumer(varA, varB, **explicit_args, **extra_kwargs)
注意事项
如果生产环境中kwargs能正常接收参数,说明生产环境传递的extra_args里的键都是MainConsumer未显式定义的参数,你可以对照生产环境的调用代码,确认他们传递的额外参数键名是否和你当前的不同。
内容的提问来源于stack exchange,提问作者Classified
相关产品推荐
相关产品推荐

