Python:如何用ast重载运算符

标签 python overloading abstract-syntax-tree

我的问题是重新定义 +-operator evaluating expression with ast. 我有一个表达式列表,很容易用 eval() 解析:

>>> expr = '1+2*3**4/5'
>>> print(eval(expr))
33.4

但我喜欢像这样重新定义列表和字典的 +-运算符(加法):

expr = '[1,2,3]+[4,5,6]'

eval 的常规结果是

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

但我想拥有

[5, 7, 9]

就像在 R 语言中一样。

同样的方法也适用于像这样的字典:

expr = "{'a':1, 'b':2} + {'a':3, 'b':4}"

我想拥有

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

简而言之,我想取代普通的 add 函数,即当操作数是 list 或 dict 时的正确操作。

我尝试使用 astNodeTransformer 但没有成功。有人可以帮助我吗?

最佳答案

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

class MyKindOfList(list):
    def __add__(self, other):
        return MyKindOfList(a + b for a, b in zip(self, other))

然后你可以这样做:

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

print (x + y)  # prints [5, 7, 9]

关于Python:如何用ast重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51917400/

相关文章:

Python 子进程无法读取 shell 中的所有输出

c++ - 将成员函数 const 和非常量重载传递给 std::function

c# - 重载转换运算符时什么时候使用关键字 "implicit"或 "explicit"?

java - 如何在 AST eclipse 中检索有关类的继承信息?

python - 如何用 pandas 打开德语 csv 文件?

python - 如何为不同的 Perl 应用程序安装专门的环境?

c# - 如何在 C# 中创建泛型方法重载?

python - 如何使用 Python 将更改应用于源文件?

c++ - Boost.Spirit将表达式转换为AST

python - 在现有的 python 字典键上添加更多值