2015-05-01 33 views
5

如何在python避免一個int作爲一個對象,但卻又是一個:的Python 2.7:整數作爲對象

如果我執行以下操作:

>>> 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 .__ anything __之類的任何內容都會產生語法錯誤。這是有道理的,因爲浮動將被視爲10.5,但是

  1. 這是如何實現/實現的?
  2. 我該如何調用int方法?

回答

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) 

此標記化作爲浮動文字10.接着是.其次是標識__add__等等。


iter().next需要是iter().__next__關於Python 3. tokenize.tokenize需要一個參數是一個readline樣功能;當被調用時,它應該返回一行程序輸入。

2

只需使用括號周圍數:

(10).__add__(20) 
2

這是詞法的問題。您可以將數字包裝在括號中以訪問成員,例如(10).__add__(20)

表達式10.__add__(20)被解析/解碼爲(10.) __add__(20)

+0

左手邊括號在這種情況下做什麼?它是否將表達式評估爲int對象? – Har

+1

我想你可以這麼說,但它是從一個float – ReyCharles

+0

'(10.)__add __(20)'和'10 .__ add __(20)'消除歧義。 – ReyCharles