2024-10-04 01:31:15 发布
网友
我想自动检测python函数中遇到的每个if条件。例如,如果我的代码命中:
if x > 2: #do something
我想录制/打印“x>;2”到控制台。
我找到了这个工具“装备”https://github.com/neuroo/equip/ 但它只在函数边界处插入。我想我需要能够在字节码指令级别上插入指令,以便将这些条件语句取出。
目前,我必须在每个if条件之后手动stdout/append
这是一个简单的示例,可以让您开始学习。假设您有这样一个模块:
def foo(x): if x > 100: print('big') else: print('small') if __name__ == '__main__': foo(5) foo(500)
如果你执行foo,你会得到:
现在,如果测试是True,则要打印每个if语句的test子句。让我们从导入foo开始:
True
if
>>> import foo
然后获取源代码:
>>> source = inspect.getsource(foo)
允许解析源代码以获取抽象语法树:
>>> tree = ast.parse(source)
下一步是定义将修改树的NodeTransformer:
>>> class IfTransformer(ast.NodeTransformer): def visit_If(self, node): new_node = ast.Expr(value=ast.Call( func=ast.Name(id='print', ctx=ast.Load()), args=[ast.Str(s=astunparse.unparse(node.test))], keywords=[] )) node.body.insert(0, new_node) return ast.fix_missing_locations(node)
为了修改树,我们让IfTransformer访问所有节点:
IfTransformer
>>> IfTransformer().visit(tree)
然后可以编译和执行新源代码:
>>> exec(compile(tree, 'foo.py', 'exec')) (__name__ == '__main__') small (x > 100) big
对于每个测试为True的if子句,都会打印测试。像你这样聪明的人可以从这里搞清楚一切。在
签出this video from Pycon 2011。在
这是一个简单的示例,可以让您开始学习。假设您有这样一个模块:
如果你执行foo,你会得到:
^{pr2}$现在,如果测试是
True
,则要打印每个if
语句的test子句。让我们从导入foo开始:然后获取源代码:
允许解析源代码以获取抽象语法树:
下一步是定义将修改树的NodeTransformer:
为了修改树,我们让
IfTransformer
访问所有节点:然后可以编译和执行新源代码:
对于每个测试为True的
if
子句,都会打印测试。像你这样聪明的人可以从这里搞清楚一切。在签出this video from Pycon 2011。在
相关问题 更多 >
编程相关推荐