gpt4 book ai didi

python - 检测 Python 代码

转载 作者:太空狗 更新时间:2023-10-30 02:15:54 25 4
gpt4 key购买 nike

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

if x > 2:
#do something

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

我发现这个工具“装备”https://github.com/neuroo/equip/但它仅用于功能边界处。我认为我需要能够在字节码指令级别进行检测,以消除这些条件。

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

if x > 2:    
list.append("x>2")

最佳答案

这是一个帮助您入门的简单示例。假设你有这样一个模块:

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


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

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

small
big

现在,如果测试为 True,您想要打印每个 if 语句的测试子句。让我们从导入 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 .

关于python - 检测 Python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47537565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com