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 ?

5voto

cherplunk Points 19

Si vous définissez strictement la fonction vous-même et qu'il s'agit d'une définition relativement courte, une solution sans dépendances consisterait à définir la fonction dans une chaîne de caractères et à affecter le eval() de l'expression à votre fonction.

Par exemple

funcstring = 'lambda x: x> 5'
func = eval(funcstring)

puis, éventuellement, de joindre le code original à la fonction :

func.source = funcstring

2voto

mtoor Points 163

La réponse de Rafa Dowgird États :

Je pense que si la fonction est compilée à partir d'une chaîne, d'un flux ou importée d'un fichier compilé, alors vous ne pouvez pas récupérer son code source.

Cependant, il es Il est possible de récupérer le code source d'une fonction compilée à partir d'une chaîne de caractères, à condition que le code de compilation ait également ajouté une entrée dans le fichier linecache.cache dict :

import linecache
import inspect

script = '''
def add_nums(a, b):
    return a + b
'''

bytecode = compile(script, 'unique_filename', 'exec')
tmp = {}
eval(bytecode, {}, tmp)
add_nums = tmp["add_nums"]

linecache.cache['unique_filename'] = (
    len(script),
    None,
    script.splitlines(True),
    'unique_filename',
)

print(inspect.getsource(add_nums))

# prints:
# """
# def add_nums(a, b):
#    return a + b
# """

C'est ainsi que le attrs bibliothèque crée automatiquement diverses méthodes pour les classes, à partir d'un ensemble d'attributs avec lesquels la classe doit être initialisée. Voir leur code source ici . Comme l'explique la source, il s'agit d'une fonctionnalité destinée principalement à permettre aux débogueurs tels que PDB de parcourir le code.

-4voto

Abgan Points 2249

I croire que les noms de variables ne sont pas stockés dans les fichiers pyc/pyd/pyo, donc vous ne pouvez pas retrouver les lignes de code exactes si vous n'avez pas les fichiers sources.

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