[英]Hacking python: postfix arguments
在Mathematica中,我可以做到這一點
10+10 // Sqrt
返回20的平方根。我正在嘗試修改python來做同樣的事情。 像這樣:
10+10 // crazy.sqrt
怎么樣? 在crazy
類中壓倒一切的運營商。 但這是后綴。 並根據此http://rgruet.free.fr/PQR26/PQR2.6.html#SpecialMethods
當我嘗試覆蓋任何運算符時,它總是alwyas self <operator> other
因此在提到的情況下,我將不得不為int,string和ton other之類的類這樣做-不好。
有沒有解決的辦法? 我想交換順序並在other
類中重新定義運算符。 (為澄清起見:將other
作為參數傳遞給self
類,例如:self .__運算符__(...,other))
也許
class WeirdMath:
def __init__(self,v):
self.val = v
def __floordiv__(self,other): #this tells us to apply whatever function to our value
return other(self.val)
import math
print WeirdMath(10+10) // math.sqrt
print WeirdMath(["a","b","c"]) // " .. ".join
可能滿足您需求的是禁忌果 ( $ easy_install forbiddenfruit
)
from forbiddenfruit import curse
def apply(self,method):
return method(self)
curse(object,"apply",apply)
def cubed(n):
return n**3
(10 + 10).apply(math.sqrt).apply(cubed)
"a big yellow house".apply(str.split).apply(" != ".join)
您可以將其修改為Python(請參閱“在不修改Python的情況下對Python進行編程” )或IPython(請參閱“自定義輸入轉換” )。
允許10 + 10 ?? func
10 + 10 ?? func
,您需要??
成為低優先級的運算符。 但是,所有Python的低序運算符要么很重要(如and
),要么具有整數的含義(如|
)。 (請參閱運算符優先級 )
選項:
|
,看起來像個煙斗 。 這將是一個抽象語法樹(AST)hack,並可能破壞使用|
語法的導入庫|
。 //
,因為那很重要)。 您需要在AST之前在字符串級別破解它。 對您來說,充分利用Python和IPython的各種命令,而完全跳過煩人的駭客可能就足夠了。
首先,可以使用Python的冪運算符來代替sqrt
。
(10+10) ** 0.5
接下來,在Python / IPython中,下划線“ _
”表示“最后結果”。 您可以輸入以下內容:
>>> 10 + 10
20
>>> sqrt(_)
4.47213595499958
(IPython還允許_14
或Out[14]
分別表示“第14個輸入的結果”,而__
和___
分別表示“倒數第二個結果”和“倒數第三個結果”。)
最后,使用IPython,如果行以斜杠開頭,則可以使用不帶括號或逗號的函數。 (在IPython中輸入?
以查看有關此的更多信息,或轉到此處 。)
In [6]: 10 + 10
Out[6]: 20
In [7]: /sqrt _
Out[7]: 4.47213595499958
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.