我将描述下面的动机,但基本问题是:我希望能够做到这样的事情:
# THIS DOESN'T WORK
def foo(var1, var2):
d = {
'a': var1,
'b': var2 if var2 is not None, # SyntaxError
}
return d
>>> foo(3, 4)
{'a': 3, 'b': 4}
>>> foo(3, None)
{'a': 3}
此说明不起作用,因为您不允许没有值的dict (key, value)
对。你必须这样做
{'b': var2 if var2 is not None else <some value>}
我想要做的是将'b'
项完全排除在返回词典之外。
有各种合理的Pythonic方法可以做到这一点,但是我能想到的所有方法都要求你迭代一个长度 - n 可迭代,其中 n 是foo
的参数数量:
# This works
def foo(var1, var2):
mapping = [
('a', var1),
('b', var2),
]
d = {k: v for (k, v) in mapping if v is not None}
return d
# As does this
def foo(var1, var2):
d = {
'a': var1,
'b': var2,
}
for k, v in d.iteritems():
if v is None:
d.pop(k)
return d
这并不昂贵,但能够在一次操作中构建dict会很不错。 你可以在一次操作中构建dict吗?
动机,如果您感兴趣:foo
实际上调用构造函数MyObj(**d)
,并且此构造函数可以采用可变数量的参数。但是,初始化MyObj.b = None
与初始化MyObj.b
不同。不,我不能改变MyObj
:)。
更新:Martijn Pieters的回答here基本上说你做不到;你要么必须处理一个单独的迭代,要么之后添加密钥(它推广到所有参数的循环)。如果仍然如此,我很高兴这个问题被关闭。