1

在 Mathematica 中,我可以做到这一点

10+10 // Sqrt

返回20的平方根。我正在尝试破解python来做同样的事情。像这样:

10+10 // crazy.sqrt

如何?重写crazy类中的运算符。但它是后缀。并根据这个 http://rgruet.free.fr/PQR26/PQR2.6.html#SpecialMethods

当我尝试覆盖任何运算符时,它总是self <operator> other如此,所以在提到的情况下,我必须为 int、string 和 ton 等其他类执行此操作 - 不好。

有没有解决的办法?我想在other 课堂上交换订单并重新定义运算符。(编辑澄清:other 作为参数传递给这样的self类:self.__ operator __(...,other))

4

2 回答 2

1

也许

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)
于 2014-07-25T21:57:44.293 回答
0

您可以将其破解到 Python 中(参见“Hacking Python without Hacking Python”)或 IPython(参见“自定义输入转换”)。

要允许10 + 10 ?? func,您需要??成为低优先级运算符。但是 Python 的所有低优先级运算符要么很重要(如and),要么对整数有意义(如|)。(请参阅运算符优先级

选项:

  1. 将其破解为 as |,它看起来像一个管道。这将是一个抽象语法树 (AST) hack,并且可能会破坏使用|.
  2. 破解一个新的运算符(但不要使用//,因为这很重要)。您需要在 AST 之前在字符串级别破解它。

对你来说,利用 Python 和 IPython 的各种命令可能就足够了,并且完全跳过了烦人的黑客攻击。

首先,sqrt您可以使用 Python 的幂运算符,而不是使用 。

(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
于 2015-07-14T02:45:11.893 回答