import ast
def extract_return(file, fname):
for x in ast.walk(ast.parse(open(file).read())):
if not(isinstance(x, ast.FunctionDef)):
continue
if not(x.name == fname):
continue
for b in x.body:
if isinstance(b, ast.Return):
if isinstance(b.value, ast.Name):
yield b.value.id
Definisce una funzione che accetta il nome file di una fonte python e un nome di funzione fname
(il tuo " x
") e restituisce ogni identificatore restituito dalla funzione fname
. Qui, presumo che ti interessi solo le dichiarazioni return
che si verificano al primo livello della funzione x
e, di conseguenza, non visito le sottoespressioni. Inoltre, sto usando yield
perché in casi più generali questo potrebbe funzionare come un filtro che potrebbe essere composto con altri. Nei casi più complessi, può essere preferibile sottoclasse ast.NodeVisitor
.
Questo è equivalente in termini di dimensioni con l'approccio regex ma molto più affidabile.