为什么python不支持三元表达式中的'pass'?

时间:2018-07-17 20:37:39

标签: python

我编写了以下代码,结果为library(stringr) strings <- c("TwoWords", "ThreeWordsTogether", "Three Words Apart", "FourWordsTogetherHere", "MiDdleCaps") strings %>% str_replace_all("([a-z])([A-Z])", "\\1 \\2") #> [1] "Two Words" "Three Words Together" #> [3] "Three Words Apart" "Four Words Together Here" #> [5] "Mi Ddle Caps"

SyntaxError: invalid syntax

我认为它会与此代码做同样的事情:

self.vec.append(v1) if v1 else pass

只是想知道为什么python在支持时不支持此语法:

if v1:
    self.vec.append(v1)

3 个答案:

答案 0 :(得分:5)

append返回None中的NoneType

>>> type([].append(420))
<class 'NoneType'>

pass仅用于流控制(NOOP),没有类型。

>>> type(pass)
Syntax Error

三元声明要求:

object = object if BoolExpr else object

pass不是object

答案 1 :(得分:2)

这里真正的问题是您不应该编写其中任何一个。 1

self.vec.append(v1) if v1 else pass是非法的,因为pass是一个语句,而不是表达式,并且您不能将语句放在表达式中。

self.vec.append(v1) if v1 else 0是合法的,因为0是一个表达式。

但是仅仅因为它是合法的并不意味着它是您应该编写的代码。

if表达式的要点是它是一个表达式,因此(a)具有可以使用的值,而(b)可以用于较大的表达式。

您没有使用self.vec.append(v1)的值(即None)或0的值(当然是0)。您只是在评估第一个的副作用,而第二个是与该语言的语法作斗争的解决方法。

您也不要将表达式放在另一个表达式中;您只是将其用作表达式语句。

这种写法很简单:

if v1:
    self.vec.append(v1)
else:
    pass

但是当然您在这里不需要else子句,因此您可以将其写为:

if v1:
    self.vec.append(v1)

或者,如果您想节省空间:

if v1: self.vec.append(v1)

有时候,为了提高性能甚至有时为了简洁起见,有必要牺牲可读性。但是您滥用if表达式的副作用的尝试会较慢(特别是在错误的情况下-跳转并评估文字以丢弃它可能会很快,但它的速度几乎不如什么都不做)。而且更长。


1。实际上,人们担心即使没有绝对理由也要尝试编写这样的代码,这是反对PEP 308(添加此功能的提议)的主要论据。 PEP之所以通过,是因为任何人只要傻到尝试写这样的代码,无论如何都会写Perl而不是Python。

答案 2 :(得分:1)

这里要直截了当的一件重要事情是,您的第一行代码是表达式,第二行代码段是语句。表达式必须计算为值,而语句只是没有值的命令。