通过** kwargs,如果不是没有

时间:2014-05-06 00:30:44

标签: python kwargs

我正在尝试将**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

2 个答案:

答案 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)