Python if x as y

5
我经常会发现自己做一些愚蠢的事情,比如说:
if some_function():
    self.value = some_function()

这会导致该函数执行两次。可以通过类似以下的方式进行修正。
value = some_function():
if value:
    self.value = value

如果Python能够允许类似以下这样的操作,那就太棒了:
if some_function() as value:
    self.value = value

这种写法既节省空间,也很清晰易懂。我甚至认为它看起来很像 Python 特有的风格。

所以,虽然这不是一种有效的语法,但是否有类似的结构我并不知道呢?值得向 Python 软件基金会建议吗?


1
否则 self.value 应该是什么?你可以这样做:self.value = some_function() or None - jonrsharpe
你想要比较什么?是“值”还是“值和数据类型”? - ZdaR
1
请注意,向Python添加新语法的门槛非常高,并且“显式优于隐式”;我怀疑这样的提议是否会被纳入该语言。 - jonrsharpe
如果(非value),那么self.value应该保持不变。 - Eldamir
1
回答你的最后一个问题:(1)PSF不是建议这个的正确地方;python-ideas邮件列表会是一个更合适的论坛,(2)在提出这样的建议之前,最好先查看python-ideas档案中是否有类似的以前建议(有相当多)。 - Mark Dickinson
显示剩余2条评论
4个回答

3
你可以始终执行以下操作:
>>> self.value = some_function() or self.value

除非 self.value 没有现有的值,否则会出现 AttributeError。 - user2357112
好的。if语句的主体可能不止是一个语句,这对你的示例无效。但你的示例可能是我想要的最接近的东西。 - Eldamir
如果可能的话,使用getattr(self, 'value') - jonrsharpe
@jonrsharpe:但是当根本不应该分配时,self.value被分配了一个None的值。 - user2357112
如果@user2357112是这种情况,那么请使用其他结构之一。 - jonrsharpe

3

Python故意禁止这样的构造,通过强制if条件成为表达式,使赋值不是一个表达式,以"明确胜于隐晦"为口号。您应该编写

value = some_function():
if value:
    self.value = value

(然而,在Ruby、C、JavaScript、Java等任何赋值是表达式的语言中都可以使用。)

请解释如何在C语言中完成这样的事情。 - spalac24
@user3267581:基本上就像你预期的那样:if (value = some_function()) { do_stuff_with(value); }。然而,许多编译器会警告这种结构,并询问您是否真的想说 if (value == some_function()) {...} - Mark Dickinson
1
确实,C语言中的一个棘手问题是必须先声明 value。此外,我(和代码检查程序)更喜欢写成if ((value = some_function())),以明确表明我们想要执行一个赋值操作而不是一个等于判断,避免出现拼写错误。 - Amadan
但这不是用户想要的。根据他的示例,如果 some_function 返回 false 类似的值,则 value 应该保持不变。但在你的示例中并非如此。 - spalac24
3
不,self.value 应该保持不变。 value 是一个与其无关的临时变量。 - Amadan
我将这个标记为答案。它似乎是更有见识的回复。 - Eldamir

0
def if_to_for(condition):
    if condition: yield condition

for value in if_to_for(some_function()):
    self.value = value

也可以正常工作。

如果条件为真,循环将执行一次,如果为假,则根本不会执行。


这非常有趣。虽然阅读起来不是很直观,但创意方面做得很好。 - Eldamir
甚至还可以这样写: for self.value in if_to_for(...): pass。 :-) - Mark Dickinson

0

理论上:

if (lambda v: globals().update({'value':v}) or v)(some_function()):
    self.value = value

在执行 if 语句之前,将函数的返回值分配给一个变量会更快。此外,可读性也很重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接