如果不为None则传递**kwargs

8 投票
2 回答
19999 浏览
提问于 2025-04-18 05:29

我想把 **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))

传递一个空的字典作为可选参数,应该和不指定可选参数是一样的。

撰写回答