我正在编写一个Python工具,它遍历AST来提取一些数据。
为了提高其可用性,我想扩展ast.AST
类,以便基于它的每个节点都具有相同的功能,例如获取父节点、子节点、兄弟节点等
在Python3.9+上,我能够将其他属性、方法和缓存属性直接附加到ast.AST
:
def _attach_to(cls, name=None):
def decorator(func):
func_name = name or func.__name__
cached = cached_property(func)
setattr(cls, func_name, cached)
# see https://bugs.python.org/issue38524
cached.__set_name__(cls, func_name) # noqa: WPS609
return func
return decorator
但是在我愿意支持的Python 3.8上,我不能将其他东西附加到ast.AST
这是一个内置的:
TypeError: can't set attributes of built-in/extension type '_ast.AST'
所以我探索了不同的东西:
ast.AST.__mro__
:__mro__
是只读的ast.AST.__bases__
:无法设置内置的属性__bases__
中将ast.AST
更改为我自己的ExtendedAST
(从ast.AST
继承):抱怨对象布局不同有没有一种方法可以动态地向内置类添加属性/方法/属性
我最终发现了一些有用的东西:我声明了一个
ExtendedAST
类,但没有将其作为ast.AST
的子类,而是将其保留为“mixin”,并将其附加到所有不同节点类的__bases__
:相关问题 更多 >
编程相关推荐