Estrai il nome della variabile di ritorno dalla funzione Python

4

Ho una funzione python x che restituisce qualche modulo X(): ritorna y

Vorrei analizzare il file x si trova in e imparare che "x restituisce questa cosa chiamata 'y'". Non ho idea di come.

Non sto cercando di ottenere il tipo del tipo restituito, solo ciò che il programmatore chiama esattamente ciò che viene restituito.

    
posta Alex 14.08.2015 - 02:11
fonte

2 risposte

7

Utilizza il modulo ast

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.

    
risposta data 14.08.2015 - 10:06
fonte
0

Sembra che tu possa hackerare qualcosa insieme con espressioni regex abbastanza rapidamente.

Pseudocodice:

import re
from collections import defaultdict
def findReturns(program_string):
    result = defaultdict(list)
    func_name = None
    for line in re.findall('def .+\w|(?<=return ).+', program_string):
       if line.startswith('def '):
           func_name = line[4:]
           continue
       result[func_name].append(line)
    return result
    
risposta data 14.08.2015 - 07:26
fonte

Leggi altre domande sui tag