检测Python Cod

2024-10-04 01:31:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想自动检测python函数中遇到的每个if条件。例如,如果我的代码命中:

if x > 2:
    #do something

我想录制/打印“x>;2”到控制台。

我找到了这个工具“装备”https://github.com/neuroo/equip/ 但它只在函数边界处插入。我想我需要能够在字节码指令级别上插入指令,以便将这些条件语句取出。

目前,我必须在每个if条件之后手动stdout/append

^{pr2}$

Tags: 工具函数代码httpsgtgithubcomif
1条回答
网友
1楼 · 发布于 2024-10-04 01:31:15

这是一个简单的示例,可以让您开始学习。假设您有这样一个模块:

def foo(x):
    if x > 100:
        print('big')
    else:
        print('small')


if __name__ == '__main__':
    foo(5)
    foo(500)

如果你执行foo,你会得到:

^{pr2}$

现在,如果测试是True,则要打印每个if语句的test子句。让我们从导入foo开始:

>>> 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().visit(tree)

然后可以编译和执行新源代码:

>>> exec(compile(tree, 'foo.py', 'exec'))
(__name__ == '__main__')

small
(x > 100)

big

对于每个测试为True的if子句,都会打印测试。像你这样聪明的人可以从这里搞清楚一切。在

签出this video from Pycon 2011。在

相关问题 更多 >