在oneline if语句python中正确使用*运算符

时间:2017-10-11 18:50:06

标签: python python-3.x

我想知道是否可以在oneline上使用*运算符来实现以下功能:

if node['args'] != None:
    return_val = funct(*node['args'])
else:
    return_val = funct()

我以为我可以说

return_val = funct(*node['args'] if node['args'] != None else None)

但事实证明这与说

相同
if node['args'] != None:
    return_val = funct(*node['args'])
else:
    return_val = funct(*None)

*None没有任何意义。

我厌倦了括号中的第一个选项,但这只会引发SyntaxError: can't use starred expression here

return_val = funct((*node['args']) if node['args'] != None else None)

4 个答案:

答案 0 :(得分:4)

是的,您需要提供空序列,而不是None

>>> def f(*args):
...     for arg in args:
...         print(arg)
...
>>> x = None
>>> y = ('a','b')
>>> f(*(y if x is not None else ()))
>>> x = object()
>>> f(*(y if x is not None else ()))
a
b

但我认为你的if -else陈述方法更为可取。我只需要看一次,我立即知道发生了什么。使用条件表达式,我必须考虑它。

此外,这是一个条件表达式,而不是"一行if语句"。

答案 1 :(得分:3)

更简洁的解决方案,尽管语义略有不同:

return_val = funct(*node['args'] or ())

如果bool(node['args'])评估为False,则空元组()将被解包(无效)并通过;否则,node['args']将被解压缩并通过。

答案 2 :(得分:1)

node['args']可以是tuple(或序列)或None

如果您的功能定义如下:

def funct(*args):
    return ...

您可以通过解压缩node['args']来调用它。 但是,如果node['args']None,则必须使用空元组()(或空序列)替换。

您可以使用*(node['args'] or ())调用您的函数,如下所示:

return_val = funct(*(node['args'] or ()))

<强>演示

def funct(*args):
    return len(args)


for node in [{'args': (1, 2, 3)}, {'args': None}]:
    return_val = funct(*(node['args'] or ()))
    print(return_val)

你得到:

3
0

答案 3 :(得分:0)

使用逻辑快捷方式可以实现所需的语法:

return_val = funct(*node['args'] or ())

当然,node['args']应该是一个序列或None,而不是,例如,零。

在Python中,None逻辑False,因此or操作将返回第二个操作数 - ()。如果第一个参数不为空,or将返回它而不评估第二个操作数。

另外值得注意的是*不是运营商。它是一种为函数提供位置参数的语法。