如果不为None则传递**kwargs
我想把 **kwargs
传给另一个函数,但只有在它不为空的情况下。目前我用的是 if else
的写法,我在想有没有更简单、更符合 Python 风格的方法?
if other:
html.append(self.render_option(val, label, selected, **other))
else:
html.append(self.render_option(val, label, selected))
如果其他的值是 NoneType
,那么我会遇到错误:
...argument after ** must be a mapping, not NoneType
2 个回答
3
这其实是一个评论,但需要格式化,而且内容太多,不能放在评论里。
我建议说:
你为什么要担心这个呢?直接传过去就行了;如果没有的话,你不会报错,对吧?
对方的回应是:
如果
other
是空的,我会报错:argument after ** must be a mapping, not NoneType
反例
def print_kwargs(**kwargs):
for k in kwargs:
print k, " => ", kwargs[k]
def kwargs_demo(a, **kwargs):
print a
print_kwargs(**kwargs)
kwargs_demo(1)
kwargs_demo(99, **{'cat':'dog', 'ice':'cream'})
输出
1
99
ice => cream
cat => dog
重新连接断开的部分?
你做的事情和我认为你在做的事情之间肯定有些不一致(而且你问题的标题似乎也是在问这个)。我可以通过下面的代码调用kwargs_mark2()
来重现你看到的错误:
def kwargs_mark2(a):
print a
other = None
print_kwargs(**other) # Fails with 'must be a mapping, not NoneType'
kwargs_mark2(24)
解决方法其实很简单(在kwargs_mark3()
中有说明):当需要一个映射时,不要创建一个None
对象——而是创建一个空的映射。
def kwargs_mark3(a):
print a
other = {}
print_kwargs(**other)
kwargs_mark3(37)
13
我会使用以下任意一种方式:
html.append(self.render_option(val, label, selected, **(other or {})))
或者
html.append(self.render_option(val, label, selected, **(other if other is not None else {})))
或者更明确的方式:
if other is None:
other = {}
html.append(self.render_option(val, label, selected, **other))
传递一个空的字典作为可选参数,应该和不指定可选参数是一样的。