Python:如何用ast重载运算符

Raf*_*ele 2 python overloading abstract-syntax-tree

我的问题是重新+定义 - 运算符用ast评估表达式.我有一个表达式列表,使用eval()很容易解决:

>>> expr = '1+2*3**4/5'
>>> print(eval(expr))
33.4
Run Code Online (Sandbox Code Playgroud)

但我喜欢重新定义+-operator(添加)列表和dict,如下所示:

expr = '[1,2,3]+[4,5,6]'
Run Code Online (Sandbox Code Playgroud)

eval的常规结果是

[1,2,3,4,5,6]

但我想拥有

[5,7,9]

喜欢用R语言.

对于这样的字典,这同样适用:

expr = "{'a':1, 'b':2} + {'a':3, 'b':4}"
Run Code Online (Sandbox Code Playgroud)

我想要

{'a':4,'b':6}

简而言之,我认为要替换普通的add函数,即当操作数是list或dict正确的动作时.

我试图用astNodeTransformer,但没有成功.有人可以帮帮我吗?

zvo*_*one 5

创建自己的列表类并在其上定义加法运算符:

class MyKindOfList(list):
    def __add__(self, other):
        return MyKindOfList(a + b for a, b in zip(self, other))
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

x = MyKindOfList([1, 2, 3])
y = MyKindOfList([4, 5, 6])

print (x + y)  # prints [5, 7, 9]
Run Code Online (Sandbox Code Playgroud)