【问题标题】:Why is "1.real" a syntax error but "1 .real" valid in Python?为什么“1.real”是语法错误,但“1 .real”在 Python 中有效?
【发布时间】:2015-06-24 21:42:18
【问题描述】:

所以我看到了these twoquestions on twitter1.real 是语法错误但1 .real 不是?

>>> 1.real
  File "<stdin>", line 1
    1.real
         ^
SyntaxError: invalid syntax
>>> 1 .real
1
>>> 1. real
  File "<stdin>", line 1
    1. real
          ^
SyntaxError: invalid syntax
>>> 1 . real
1
>>> 1..real
1.0
>>> 1 ..real
  File "<stdin>", line 1
    1 ..real
       ^
SyntaxError: invalid syntax
>>> 1.. real
1.0
>>> 1 .. real
  File "<stdin>", line 1
    1 .. real
       ^
SyntaxError: invalid syntax

【问题讨论】:

  • 我猜1. 被贪婪地解析为浮点数,然后real 缺少.,而1 .real1 解析为int。小数点周围不允许有空格,但“方法访问点”前后可以有空格(因为没有更好的名称)。
  • 试试:(1).real or 1.0.real or 1..real (都一样)
  • 有一些参数可以改变这种行为,但是如果你让1.real 成为一个属性访问,那么1.e4 看起来就像一个属性访问,并且用于产生10000.0 的完美代码突然产生一个属性错误。这不值得麻烦。我很确定 Ruby 允许这种访问,因为 int 有更多有趣的方法;我不确定他们如何处理它。
  • 旁白:请尽量避免点击诱饵的问题标题——也就是说,请尝试添加足够的信息,以便人们可以合理地了解问题是否有趣或适用于他们之前 他们点击打开它。我已尝试在此处对其进行编辑。

标签: python


【解决方案1】:

我猜. 被贪婪地解析为数字的一部分,如果可能的话,使其成为float 1.,而不是成为方法调用的一部分。

小数点周围不允许有空格,但在方法调用中. 前后可以有空格。如果数字后跟一个空格,则终止数字的解析,所以它是明确的。

让我们看看不同的情况以及它们是如何解析的:

>>> 1.real    # parsed as (1.)real  -> missing '.'
>>> 1 .real   # parsed as (1).real  -> okay
>>> 1. real   # parsed as (1.)real  -> missing '.'
>>> 1 . real  # parsed as (1).real  -> okay
>>> 1..real   # parsed as (1.).real -> okay
>>> 1 ..real  # parsed as (1)..real -> one '.' too much
>>> 1.. real  # parsed as (1.).real -> okay
>>> 1 .. real # parsed as (1)..real -> one '.' too much

【讨论】:

  • 我很想对此投反对票,因为我不想承认1..real 是“好的”....+1 虽然向我展示了我没有的东西(令人畏惧)没有意识到。
  • 有趣的事实:SO 对这个答案的语法突出显示与 Python 解释它的方式是一致的。也就是说,1real 之间应该正好有一个黑点(而不是红点)。
  • @leewangzhong 嗯,SO 使用 google-prettify 来执行高亮显示,众所周知,google 使用了大量 Python,所以高亮显示实际上是一个很好的而不是简单的近似也就不足为奇了...
【解决方案2】:

对于1.real,Python 正在寻找像1.0 这样的浮点数字文字,而您不能在浮点数中使用r。对于1 .real,Python 将1 作为一个整数并对其进行属性查找。

请务必注意,浮点语法错误处理发生在 . 属性查找之前。

【讨论】:

  • 如果有一个名为real的成员,为什么1.real会导致语法错误?
  • type dir(int()) 你会看到很多方法......你不能以1.xxxx 访问它们中的任何一个,但是你可以使用1 .xxxx(1).xxxxx 访问它们中的任何一个
  • 啊,因为浮点中的. 优先于属性查找中的.
  • @JoranBeasley 哦。所以1.real 就像写1. real 一样无效。
  • @kindall 关键是大多数人用括号解决语法歧义。不带空格。
【解决方案3】:

1 .real 有效,因为它是在整数 1 上调用的属性 .real。

1.real 不起作用,因为您必须在浮点数的末尾留一个空格。否则是语法错误。

【讨论】:

  • 文字末尾不需要空格。 1+2 很好,1..real 很好,等等。
猜你喜欢
  • 2019-11-06
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2020-06-26
  • 2015-02-17
  • 1970-01-01
  • 2022-06-13
相关资源
最近更新 更多