2013-12-17 33 views
0

有沒有一種方法可以像運算符重載一樣使用變量。 例如運算符在Python函數中重載的類似用法

a += 1 

代替a = a + 1

a = max(a, some_other_variable) 

的MAX()函數僅僅是一個例子。


注: 我在這裏的目的不是使用變量「A」再次,如果可能的話。這兩個例子是不同的,彼此不相關。 例如

a = some_function(a, b) 

在此,值從some_function返回()被分配回變量 'a' 一次。 除非變量'a'是一個類變量,我不能訪問函數some_function()中的變量,但是如果有一種方法可以只使用它一次嗎?

+1

我很困惑。您想做什麼?你能澄清嗎? – mgilson

+0

最有可能像'a max = 1'這樣的假設會產生像a = max(a,1)這樣的效果。我經常希望語言足夠表達,以允許這樣的結構,儘管'對列表或基因xp進行最大化往往是一個很好的替代品。 – user2357112

回答

2

你不能在Python代碼中直接補充Python的操作符和語句集合。但是,您可以編寫一個使用Python的language services的包裝來編寫包含您想要的操作符的Pythonesque DSL。

2

我覺得你想沿着這些路線的東西...

>>> class Foo(object): 
...  def __iadd__(self, other): 
...   return max(self.num, other) 
...  def __init__(self, num): 
...   self.num = num 
... 
>>> a = Foo(5) 
>>> a += 4 
>>> print a 
5 
>>> a = Foo(4) 
>>> a += 6 
>>> a 
6 

但請注意,我會考慮這個使用__iadd__是很不禮貌的。有__iadd__返回self以外的東西通常不考慮,如果類型是可變的。

+0

但是,這將有相同的問題,使用'a'兩次,因爲你需要重新聲明它(如果它已經聲明),以使這種新類型... – JBernardo

+0

@JBernardo - 我是不明白你的意思。你是否建議我刪除'max'函數以支持'self如果self.num> other other''這樣的東西? – mgilson

+0

不,我只是說如果最初的問題是「輸入'兩次」,那麼除了'a'還沒有被聲明的情況之外,你將會維持這個問題。'a = Foo(a); A + = B' - >見,'美孚(一)'是同樣的問題'MAX(A,B)' – JBernardo

0

不像第二部分那樣爲a重載一個運算符,你可以爲第二部分創建一個類似部分的對象。 (我用左移位運算符「酷」)

class partial(functools.partial): 
    def __rlshift__(self, val): 
     return self(val) 

,並使用這樣的:

>>> a = 10 
>>> a <<= partial(max, 20) 
>>> a 
20 

所以你不必亂用您的變量類型來執行操作。你也不需要爲每個函數聲明一個新的類。

PS:注意實際執行是max(20, a)