Допустим, у меня есть набор функций 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
и пройтись по коду функции, который я получаю из inspect.getsource
. Но я открыт для любых других предложений, это была только идея, как это могло бы работать.
Насколько я пришел с ast
:
def uses_module(function):
import ast
import inspect
nodes = ast.walk(ast.parse(inspect.getsource(function)))
for node in nodes:
print(node.__dict__)