1

这行代码在 PyPy 中失败:

expr.__repr__ = lambda self: ast.dump(self, annotate_fields=False)
TypeError: can't set attributes on type object 'expr'

即使它在普通 python 中效果很好,即它给我的 AST 节点一个明智的__repr__. 有什么理由让它在 PyPy 中不起作用,有没有办法解决它?我尝试对repr函数本身进行猴子补丁的尝试失败了。

4

2 回答 2

2

不幸的是,没有简单的方法。list在 PyPy 上,AST 类的行为类似于内置类型int,您无法更改它们。如果你想定义一个自定义的 repr,你能做的最好的就是定义你自己的函数。您可能会发现ast.NodeVisitor该类可以方便地实现这样的功能。

于 2013-05-01T03:39:24.767 回答
0

只是为了记录,我测试了forbiddenfruit在cpython 3.6.6上向int添加了一个方法,它起作用了:

$ipython
Python 3.6.6 (default, Jul 21 2018, 02:39:08)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from forbiddenfruit import curse

In [2]: curse(int, 'test', lambda self: 'hi')

In [3]: (1).test()
Out[3]: 'hi'
于 2018-09-16T20:22:18.277 回答