当前位置: 首页 > 面试题库 >

为什么这不是python中的语法错误?

章德惠
2023-03-14
问题内容

注意到今天在我们的代码库中有一行代码,我认为肯定会因语法错误而使构建失败,但是测试通过了,显然它实际上是有效的python(在2.x和3中)。

条件表达式有时不需要空格:

>>> 1if True else 0
1

如果LHS是变量,则不起作用:

>>> x = 1
>>> xif True else 0
  File "<stdin>", line 1
    xif True else 0
           ^
SyntaxError: invalid syntax

但是它似乎仍然可以与其他类型的文字一起使用:

>>> {'hello'}if False else 'potato'
'potato'

这是怎么回事,出于某种原因,它是否有意成为语法的一部分?这个奇怪的怪癖是已知/记录的行为吗?


问题答案:

令牌之间的空白

除逻辑行的开头或字符串文字外,空格字符空格,制表符和换页符可互换使用以分隔标记。仅当两个令牌的级联可以另外解释为其他令牌(例如,ab是一个令牌,而ab是两个令牌)时,才需要在两个令牌之间使用空格。

因此,在这种情况下,1if它不是有效的令牌,因此空白是可选的。将1解释为if不属于的整数文字。因此if被单独解释并识别为关键字。

xif但是,标识符是公认的,所以Python是不是能看到你想做的事x if那里。



 类似资料:
  • 问题内容: 将布尔值与Python中的作品进行比较。但是,当我应用布尔运算符时,结果是语法错误: 为什么这是语法错误?我希望它是一个返回布尔值的表达式,并且只要是具有有效语法的表达式,它都是有效语法。 问题答案: 它与Python中的运算符优先级有关(解释器认为您正在比较True与Not,因为它的优先级高于)。您需要一些括号来阐明操作顺序: 通常,不能在没有括号的比较右侧使用。但是,我想不出您需要

  • 如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()没有超出范围?

  • 我希望能够像这样使用Stream::FlatMap 但我得到以下编译器错误 test.java:25:错误:不兼容类型:无法推断类型变量R ListofStrings.Stream().FlatMap(str->duplicate(str)).Collect(Collectors.ToList()); 为什么这不是Java中flatMap的有效用法?

  • 问题内容: 所以我在推特上看到了这两个 问题。语法错误怎么回事,但不是吗? 问题答案: 我猜想,如果可能的话,贪婪地将其解析为数字的一部分,使其成为 ,而不是方法调用的一部分。 小数点附近不能有空格,但是在方法调用中,您可以在空格前后添加空格。如果数字后跟一个空格,则该数字的解析将终止,因此无歧义。 让我们看一下不同的情况及其解析方式:

  • 我在最后一行中找不到错误。我是这门语言的初学者。提前谢谢。 我的输出说最后一行。