2017-08-27 2 views
-2

J'ai reçu un code Python, ainsi que les modules qu'il importe. Je voudrais construire un arbre indiquant quelle fonction appelle quelles autres fonctions. Comment puis je faire ça?Création d'un arbre d'appel pour un code Python

+0

Pourquoi vote serré? Il ya quelques mois, j'ai posé une question similaire pour la langue 'r' et il a été jugé apte pour ce site: https://stackoverflow.com/questions/44198599/build-a-file-diagram-for-an-r-code – DeltaIV

+0

Euh, les votes serrés en fait :) Je suppose que je vais devoir demander sur SO Meta – DeltaIV

+0

Les électeurs proches croient que votre question est trop large (n'est-ce pas?). Vous avez également dit que vous «cherchez un module ou un outil qui peut le faire automatiquement», ce qui signifie que votre question est également [hors sujet] (http://stackoverflow.com/help/on-topic) pour Stack Overflow. – vaultah

Répondre

1

vous pouvez utiliser le ast module (arbre de syntaxe abstraite) de la bibliothèque standard de python

# foo.py 
def func(x): 
    print('hello') 

analyse syntaxique du fichier en utilisant ast.parse:

import ast 
tree = ast.parse(open('foo.py').read()) 
print(ast.dump(tree)) # dumps the whole tree 

# get the function from the tree body (i.e. from the file's content) 
func = tree.body[0] 

# get the function argument names 
arguments = [a.arg for a in func.args.args] 
print('the functions is: %s(%s)' % (func.name, ', '.join(arguments))) 

sorties:

"Module(body=[FunctionDef(name='func', args=arguments(args=[arg(arg='x', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='hello')], keywords=[]))], decorator_list=[], returns=None)])" 

the functions is: func(x) 
+0

Cela semble intéressant! Je ne suis pas sûr de savoir comment l'utiliser, cependant. Si demain je modifie ma question en ajoutant un exemple minimal, pourriez-vous me montrer comment utiliser ast pour construire l'arbre d'appel correspondant? – DeltaIV

+0

Hmm, la sortie semble trop verbeuse pour être utile. Il semble inclure également toutes les déclarations à l'intérieur de chaque fonction, pas seulement les appels. Sur un code de mille lignes, avec de nombreuses dépendances, je ne pense pas que ça va générer une sortie utilisable. Est-il possible de limiter la sortie aux appels de fonction? Demain, je vais ajouter un exemple minimal, avec l'entrée et la sortie désirée. Le 'ast.dump (tree)' affiche seulement joliment l'arborescence pour le débogage propose – DeltaIV

+1

vous pouvez accéder aux membres et aux attributs de l'arborescence. J'ai ajouté un exemple d'obtention du nom de la fonction et des arguments – ShmulikA

1

Vous devriez commencer par la fonction principale du programme et au premier niveau relier toutes les fonctions qui sont appelées depuis le principal cela fournirait un point de départ et ensuite vous pouvez relier toutes les fonctions en dessous.