2010-05-05 27 views
4

有什麼辦法可以讓Python運算符使用「==」和「>」返回ints而不是bools。我知道我可以使用int函數(int(1 == 1))或添加0((1 == 1) + 0),但我想知道是否有一個簡單的方法來做到這一點。就像你想要師返回花車一樣,你可以輸入from __future__ import division。有沒有辦法與運營商返回整數?或者,我可以讓課程擴展到__future__._Feature,這將會做我想要的嗎?Python運算符返回整數

+1

這似乎是一個很奇怪的要求,沒有明確的動機。你想多解釋一下爲什麼你認爲你需要這個? – 2010-05-05 23:11:45

+0

我正在編寫一個基於堆棧的編程語言。如果使用大於或小於它的值,它會從堆棧中彈出兩個項目並執行類似'stack.push(stack.pop()> stack.pop())'的操作。如果我想打印這個整數,它會把堆棧的頂部,並使用'str(stack.pop())'將其轉換爲一個字符串,並打印出來。我希望打印1或0,但打印出「真」或「假」。這使得if語句等事情變得複雜。 – None 2010-05-05 23:17:11

+5

在Python中修改基本運算符不是答案。你可能不想Python的>(寫你自己的函數),或者你需要不同的行爲來將布爾轉換爲字符串(編寫你自己的函數)。 – 2010-05-05 23:30:18

回答

1

根據您的澄清,則可能會在比較操作更改爲類似:

stack.push(1 if stack.pop() > stack.pop() else 0) 

這將轉換的>10布爾結果,你想。

此外,請注意在同一個表達式中調用stack.pop()兩次。你不知道(可以肯定)參數的評估順序,Python的不同實現可能會以不同的順序彈出參數。您將需要使用臨時變量:

x = stack.pop() 
y = stack.pop() 
stack.push(1 if x > y else 0) 
+0

我在代碼中做了不同的'stack.pop(),但試圖在我的評論中壓縮它們。不過謝謝。 – None 2010-05-05 23:34:47

+0

表達式的評估順序在語言參考(http://docs.python.org/reference/expressions.html#evaluation-order)中指定。 也就是說,在一個不平凡的表達式中有副作用的函數調用通常是一個壞主意。 – 2010-05-07 11:47:49

3

你不能覆蓋內置的比較函數。在某種意義上,比較運算符已經返回intboolint的子類,所以你可以對它做任何事情,你可以做一個int。這個問題就變成了爲什麼你想要比較返回int對象,而不是bool對象?

1

你可以有你的自定義類的比較操作符返回任何你喜歡的 - 簡單地執行相關方法(__eq____ne____gt____lt____ge____le__)返回你想要什麼。對於你不控制的對象,你不能改變這個,但不應該有:bools 整數,因爲the Liskov substitution principle。注意內置類型'__eq__方法返回的bool和任何其他整數之間的區別的代碼是使用錯誤的結果。

__future__模塊在這裏不相關;你不能用它來做任何你想做的事情,你只能用它來改變添加到Python的特定設置。您可以將導入的__future__導入真分區,因爲這是添加到Python中的內容。添加更多__future__導入的唯一方法是修改Python本身。

1

在您自己的對象上,很容易覆蓋每個比較運算符。對於內置插件,重寫方法是「只讀」,所以我設置它們的所有嘗試都不會移出。

>>> class foo: 
    def __lt__(self, other): 
     return cmp(5, other) 

>>> f = foo() 
>>> f<3 
1 
>>> f<7 
-1 
>>> f<5 
0 

>>> j="" 
>>> j.__lt__=lambda other: cmp(5, other) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
AttributeError: 'str' object attribute '__lt__' is read-only 
0

把你的布爾投射到int?

>>> int(True)

1

>>> int(False)

0

或者強制轉換到海峽?

>>> str(int(True))

'1'

>>> str(int(False))

'0'

0

不,你不能。當Guido統一類型和類時,他發現了一種重寫內置類型行爲的方法(由於他實現的方式),但他宣稱它是一個bug並堵塞了漏洞。改變內置類型的行爲(除了你的例子 - 從未來導入分區,這是有原因的)被禁止。

對不起,但我找不到郵件列表文章。我記得它,因爲它很有趣。