簡體   English   中英

黑客python:后綴參數

[英]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 ),要么具有整數的含義(如| )。 (請參閱運算符優先級

選項:

  1. 破解為| ,看起來像個煙斗 這將是一個抽象語法樹(AST)hack,並可能破壞使用|語法的導入庫|
  2. 入侵一個新的運算符(但不要使用// ,因為那很重要)。 您需要在AST之前在字符串級別破解它。

對您來說,充分利用Python和IPython的各種命令,而完全跳過煩人的駭客可能就足夠了。

首先,可以使用Python的冪運算符來代替sqrt

(10+10) ** 0.5

接下來,在Python / IPython中,下划線“ _ ”表示“最后結果”。 您可以輸入以下內容:

>>> 10 + 10
20
>>> sqrt(_)
4.47213595499958

(IPython還允許_14Out[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM