【发布时间】:2018-12-16 00:51:03
【问题描述】:
假设我有一堆函数a、b、c、d 和e,我想知道它们是否调用了random 模块中的任何方法:
def a():
pass
def b():
import random
def c():
import random
random.randint(0, 1)
def d():
import random as ra
ra.randint(0, 1)
def e():
from random import randint as ra
ra(0, 1)
我想写一个函数uses_module,这样我就可以期待这些断言通过了:
assert uses_module(a) == False
assert uses_module(b) == False
assert uses_module(c) == True
assert uses_module(d) == True
assert uses_module(e) == True
(uses_module(b) 是 False,因为 random 仅被导入,但从未调用其方法之一。)
我无法修改 a、b、c、d 和 e。所以我认为可以使用ast 并沿着我从@987654339@ 获得的函数代码进行操作。 但我对任何其他建议持开放态度,这只是一个想法。
据我所知ast:
def uses_module(function):
import ast
import inspect
nodes = ast.walk(ast.parse(inspect.getsource(function)))
for node in nodes:
print(node.__dict__)
【问题讨论】:
-
我想会有一条使用
mock和assert_called来模拟在 ast 类型中找到的函数的路径。会考虑的
标签: python abstract-syntax-tree static-analysis inspect