Python 2.7:作为对象的Ints

Har*_*Har 5 python python-2.7

python中的int如何避免成为一个对象,但却是一个:

如果我执行以下操作:

>>> dir(10)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> 10.__add__(20)
  File "<stdin>", line 1
    10.__add__(20)
             ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

如果我输入10.它产生10.0而10之类的任何东西__产生语法错误.它确实有意义,因为浮点数将被视为10.5但是

  1. 这是如何实现/实现的?
  2. 如何在int上调用int方法?

Ant*_*ala 7

Python标记器是贪婪的,它总是试图匹配任何给定位置可能的最长标记; 否则它可能会认为10.e+123是相同的(10).e + 123.

如果10.__add__(20)它看到以下令牌:

>>> tokenize.tokenize(iter(['10.__add__(20)']).next)
1,0-1,3:        NUMBER  '10.'
1,3-1,10:       NAME    '__add__'
1,10-1,11:      OP      '('
1,11-1,13:      NUMBER  '20'
1,13-1,14:      OP      ')'
2,0-2,0:        ENDMARKER       ''
Run Code Online (Sandbox Code Playgroud)

即,.被认为是数字文字的一部分,例如a float.如果你用数字((10).__add__(20))括号,你会得到:

>>> tokenize.tokenize(iter(['(10).__add__(20)']).next)
1,0-1,1:        OP      '('
1,1-1,3:        NUMBER  '10'
1,3-1,4:        OP      ')'
1,4-1,5:        OP      '.'
1,5-1,12:       NAME    '__add__'
1,12-1,13:      OP      '('
1,13-1,15:      NUMBER  '20'
1,15-1,16:      OP      ')'
2,0-2,0:        ENDMARKER       ''
Run Code Online (Sandbox Code Playgroud)

同样,只需在数字和点(10 .)之间添加一个空格就可以了.

这里将.其标记为单独的运算符.如果float常量可以,那么你可以实际键入:

10..__add__(20)
Run Code Online (Sandbox Code Playgroud)

这被标记为float literal 10.,.后跟标识符__add__,依此类推.


愚蠢的iter().next需要iter().__next__在Python 3上.tokenize.tokenize需要一个类似readline函数的参数; 当被调用时,它应该返回一行程序输入.