为什么在Python中对数值文本调用方法是语法错误?

2024-04-18 23:52:39 发布

您现在位置:Python中文网/ 问答频道 /正文

仅当我将数字绑定到名称时,才能对数字调用方法:

>>> a = 5
>>> a.bit_length()
3

我可以调用字符串文本的方法:

>>> 'Hello World'.lower()
'hello world'

但我不能调用数值文本的方法:

>>> 5.bit_length()

这会引起SyntaxError。这有实际原因吗,还是历史原因?你知道吗

编辑刚刚找到这个related question显示了解决方法(这里也已经建议了)。我想这也回答了主要的问题-简单的解决方法可用,使语法更复杂(更难解析)可能没有足够的好处使这项工作。你知道吗


Tags: 方法字符串文本名称helloworldbit原因
2条回答

实际上,这四个规则有点错误,语法错误的原因不是fraction规则不匹配。你知道吗

语法错误的原因是使用此规则将其解析为浮点:

pointfloat    ::=  [intpart] fraction | intpart "."

数字匹配第二种形式,即整数部分后跟一个.-5.是浮点的有效文本,5.bit_length生成的标记流生成两个标记:5.(即,浮点5.0)和bit_length;浮点文本后跟一个名称在python中是语法错误的。你知道吗

实际上可以调用float方法,但是有两个点:

>>> 5.0.hex()
'0x1.4000000000000p+2'
>>> 5..hex()
'0x1.4000000000000p+2'

要调用int方法,需要将5.分开,以便将它们作为单独的标记进行解析。你知道吗

浮点数按照以下规则进行分析,quoting from the docs

floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [intpart] fraction | intpart "."
exponentfloat ::=  (intpart | pointfloat) exponent
intpart       ::=  digit+
fraction      ::=  "." digit+
exponent      ::=  ("e" | "E") ["+" | "-"] digit+

当Python看到5.时,它认为语法遵循[intpart] fraction | intpart "."规则。因此,它选取下一个字符并发现它与fraction规则不匹配。这就是抛出语法错误的原因。你知道吗

你可以通过

5 .bit_length()

或者用这样的括号括起来

(5).bit_length()

相关问题 更多 >