最近准备读一遍python标准库,当读到内置类型时,发现int和float等类型还有一些方法,例如下面一些方法:

int.bit_length()
返回以二进制表示一个整数所需要的位数,不包括符号位和前面的零:

float.is_integer()
如果 float 实例可用有限位整数表示则返回 True,否则返回 False:

我想是不是字面量的int和float是不是可以直接调用方法来使用,于是在python shell中进行如下尝试:

1.bit_length()
"""
  File "<stdin>", line 1
    1.bit_length()
      ^
SyntaxError: invalid syntax
"""

1.1.is_integer()
"""
False
"""

果然,数字字面量是可以直接调用方法的,如果以前接触过C/C++和Java,还是会惊讶的。

因为1.1.is_integer()这条语句可以执行,令人奇怪的是1.bit_length()却报语法错误。类比第二条语句的执行成功,这一条语句明明是语义正确的,我用我那三脚猫的编译原理的知识,猜测python编译器可能出问题了🤪,在词法分析阶段,数字和点结合不能接字母,1.b被认为是出错的。

带着这个发现,我竟然有我的名字可能会计入python史册的妄想。冷静下来,python都30多年的历史了,不可能这点问题都没人发现吧。或许这种特殊情况会有替代方案呢,例如用空格隔开:

1 .bit_length()  # 1后面有一个空格
"""
1
"""

竟然执行成功了!突然觉得,原因好像不是,空格是用来处理这种特殊情况的方式,而是点.可以当作一个普通的运算符号,就像加+减-乘*除/一样,前后有多少空格都无所谓:

5    *  6  # 乘号*前后各有很多空格
"""
30
"""
 'ASDF'  .  lower()  # 点.前后有很多空格
"""
'asdf'
"""

果然是这样。数字字面量直接调用方法,点.处理起来像是普通的运算符,python真是灵活的不行🤯。