从脚本foo.py开始,递归地查找本地源代码(即非内置或第三方程序包)中正在使用的所有函数。
编辑:我不想找到递归函数。我想找到所有正在使用的功能!
例如foo.py
import bar
def not_used():
pass
bar.do_stuff(x,y)
bar.py
import math
def more_stuff(x,y):
result = math.abs(-x+-y)
return result
def do_stuff(x,y):
more_stuff(x,y)
应返回do_stuff和more_stuff
应该忽略not_used和abs
非常感谢
编辑:到目前为止的代码
import dis
py_file = 'foo.py'
with open(py_file) as file:
source_code = file.read()
compiled = compile(source_code, py_file, "exec")
funcs = []
byte_code = dis.Bytecode(compiled)
instructions = list(reversed([x for x in byte_code]))
for (ix, instruction) in enumerate(instructions):
if instruction.opname == "CALL_FUNCTION":
load_func_instr = instructions[ix + instruction.arg + 1]
funcs.append(load_func_instr.argval)
results = [f'{ix}: {funcname}'for (ix, funcname) in enumerate(reversed(funcs), 1)]
答案 0 :(得分:0)
您可以使用Python的ast (abstract syntax tree)模块
一个简短的例子:
import ast
code = """
import math
def more_stuff(x,y):
result = math.abs(-x+-y)
return result
def do_stuff(x,y):
more_stuff(x,y)
"""
tree = ast.parse(code)
funcs = [x for x in ast.walk(tree) if isinstance(x, ast.FunctionDef)]
print(', '.join(f.name for f in funcs))
打印:
more_stuff, do_stuff
现在您可以添加自己喜欢的测试了。例如SO问题
How to find/detect if a build-in function is used in Python AST?
讨论如何检测是否正在使用函数。