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
如果我输入10.它产生10.0而10之类的任何东西__产生语法错误。它确实有意义,因为浮点数将被视为10.5但
答案 0 :(得分: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 ''
即,.
被认为是数字文字的一部分,例如一个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 ''
同样,只需在数字和点(10 .
)之间添加一个空格就可以了。
此处.
被标记为单独的运算符。如果float
常量可以,那么您实际上可以键入:
10..__add__(20)
这被标记为float literal 10.
,后跟.
,后跟标识符__add__
,依此类推。
在Python 3上,愚蠢的iter().next
需要iter().__next__
。tokenize.tokenize
需要一个类似readline
的函数的参数;当被调用时,它应该返回一行程序输入。
答案 1 :(得分:2)
只需在数字周围使用括号:
(10).__add__(20)
答案 2 :(得分:2)
这是一个lexing的问题。您可以将数字包装在括号中以访问成员,例如(10).__add__(20)
表达式10.__add__(20)
被解析/ lexed为(10.) __add__(20)
。