1

假设你有一个函数,它有时返回一个值,有时不返回,因为在这种情况下你真的没有什么可以返回的,甚至没有默认值之类的。现在你想对结果做点什么,但当然只有在有结果的时候。

例子:

result = function_call(params)
if result:
    print result

有没有办法以更 Pythonic 的方式编写它,甚至可能在一行中?

像那样:

print function_call(params) or #nothing

(请注意,我的意思是它不应该打印“nothing”或“None”。如果结果是,它实际上应该根本None打印)

4

3 回答 3

5

不; 在 Python 中,名称绑定是一个语句,因此不能用作语句中的表达式。因为print也是一个声明,你将需要 3 行;在 Python 3 中,您可以编写:

result = function_call(params)
print(result) if result else None

这对于理解或生成器中的名称绑定来说并不完全正确,其中名称绑定是一个具有语句式语义的语法项:

[print(result) for result in generator_call(params) if result]

正如 Kos 所说,您可以滥用它来创建单元素理解:

[print(result) for result in (function_call(params), ) if result]

另一个执行名称绑定并且同样可以被滥用的语法项是lambda表达式:

(lambda result: print(result) if result else None)(function_call(params))

请注意,在这两种情况下,对返回值的操作都必须是表达式而不是语句。

于 2012-08-06T11:02:04.340 回答
3

我认为更 Pythonic 的版本实际上更接近您的原始版本:

result = function_call(params)
if result is not None:
    do_something(result)

检查对is (not) None我来说似乎很惯用 - 我自己用过几次,我也看到它在其他地方使用过[需要引用]。

于 2012-08-06T11:35:42.637 回答
-1

从答案到现在,我会这样做:

>>> from __future__ import print_function #if Python2.7
>>> def filtered_print(txt):
...    txt and print(txt)
...
>>> filtered_print('hello world')
hello world
>>> filtered_print('None')
None
>>> filtered_print(None)
>>>

如果其他人有更好的解决方案,我仍然愿意接受替代方案!

于 2012-08-06T12:06:34.677 回答