这行代码在 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
函数本身进行猴子补丁的尝试失败了。
这行代码在 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
函数本身进行猴子补丁的尝试失败了。
不幸的是,没有简单的方法。list
在 PyPy 上,AST 类的行为类似于内置类型int
,您无法更改它们。如果你想定义一个自定义的 repr,你能做的最好的就是定义你自己的函数。您可能会发现ast.NodeVisitor
该类可以方便地实现这样的功能。
只是为了记录,我测试了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'