我正在尝试将**kwargs
传递给另一个函数,但前提是它不是null。现在我有这个if else
,我想知道是否有更高效的pythonic方式?
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
答案 0 :(得分:9)
我会使用
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))
将空字典作为kwargs传递应该与不指定kwargs相同。
答案 1 :(得分:1)
这实际上是一个评论,但它需要格式化,而且太大而无法放入评论中。
我建议:
你为什么担心它?只是通过他们;如果没有错误你就不会收到错误,是吗?
回应是:
如果
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)