547 votes

Comment puis-je obtenir le code source d'une fonction Python ?

Supposons que j'ai une fonction Python telle que définie ci-dessous :

def foo(arg1,arg2):
    #do something with args
    a = arg1 + arg2
    return a

Je peux obtenir le nom de la fonction en utilisant foo.func_name . Comment puis-je obtenir par programme son code source, comme je l'ai tapé ci-dessus ?

23voto

TomDotTom Points 41

Pour développer la réponse de Runeh :

>>> def foo(a):
...    x = 2
...    return x + a

>>> import inspect

>>> inspect.getsource(foo)
u'def foo(a):\n    x = 2\n    return x + a\n'

print inspect.getsource(foo)
def foo(a):
   x = 2
   return x + a

EDIT : Comme indiqué par @0sh cet exemple fonctionne en utilisant ipython mais pas simple python . Il devrait cependant fonctionner dans les deux, lors de l'importation de code à partir de fichiers sources.

14voto

smarie Points 453

Puisque ce post est marqué comme étant le duplicata de cet autre poste Je réponds ici pour le cas "lambda", bien que l'OP ne concerne pas les lambdas.

Ainsi, pour les fonctions lambda qui ne sont pas définies dans leurs propres lignes : en plus de marko.ristin vous pouvez utiliser la réponse de mini-lambda ou utiliser SymPy comme suggéré dans cette réponse .

  • mini-lambda est plus légère et supporte tout type d'opération, mais ne fonctionne que pour une seule variable
  • SymPy est plus lourd mais beaucoup plus équipé pour les opérations mathématiques/calculs. Il peut notamment simplifier vos expressions. Il supporte également plusieurs variables dans une même expression.

Voici comment vous pouvez le faire en utilisant mini-lambda :

from mini_lambda import x, is_mini_lambda_expr
import inspect

def get_source_code_str(f):
    if is_mini_lambda_expr(f):
        return f.to_string()
    else:
        return inspect.getsource(f)

# test it

def foo(arg1, arg2):
    # do something with args
    a = arg1 + arg2
    return a

print(get_source_code_str(foo))
print(get_source_code_str(x ** 2))

Il donne correctement

def foo(arg1, arg2):
    # do something with args
    a = arg1 + arg2
    return a

x ** 2

Voir mini-lambda documentation pour les détails. Au fait, je suis l'auteur ;)

12voto

Krutarth Gor Points 139

Vous pouvez utiliser inspect pour obtenir le code source complet de ce module. Vous devez utiliser getsource() pour cela à partir de la inspect module. Par exemple :

import inspect

def get_my_code():
    x = "abcd"
    return x

print(inspect.getsource(get_my_code))

Vous pouvez consulter d'autres options sur le lien ci-dessous. récupérer votre code python

8voto

douardo Points 469

Pour résumer :

import inspect
print( "".join(inspect.getsourcelines(foo)[0]))

6voto

marko.ristin Points 28

Veuillez noter que les réponses acceptées ne fonctionnent que si le lambda est donné sur une ligne séparée. Si vous le passez en tant qu'argument d'une fonction et que vous souhaitez récupérer le code du lambda en tant qu'objet, le problème se complique un peu car inspect vous donnera la ligne entière.

Par exemple, considérons un fichier test.py :

import inspect

def main():
    x, f = 3, lambda a: a + 1
    print(inspect.getsource(f))

if __name__ == "__main__":
    main()

En l'exécutant, vous obtenez (attention à l'indentation !) :

    x, f = 3, lambda a: a + 1

Pour récupérer le code source de la lambda, votre meilleure chance, à mon avis, est de ré-analyser le fichier source entier (en utilisant f.__code__.co_filename ) et faire correspondre le nœud lambda AST par le numéro de ligne et son contexte.

C'est précisément ce que nous avons dû faire dans notre bibliothèque de conception par contrat. icontrat puisque nous avons dû analyser les fonctions lambda que nous passons en tant qu'arguments aux décorateurs. Il y a trop de code à coller ici, alors jetez un coup d'oeil à l'implémentation de cette fonction .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X