696 votes

Comment obtenir le nom de la fonction comme une chaîne de caractères en Python?

En Python, comment puis-je obtenir le nom de la fonction comme une chaîne sans appel de la fonction?

def my_function():
    pass

print get_function_name_as_string(my_function) # my_function is not in quotes

devrait de sortie "my_function".

Est-ce disponible en python? Si non, une idée de comment écrire get_function_name_as_string en python?

882voto

user28409 Points 6460
my_function.__name__

À l'aide de __name__ est la méthode préférée car elle s'applique de manière uniforme. Contrairement aux func_name, il travaille sur des fonctions intégrées ainsi:

>>> import time
>>> time.time.func_name
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'builtin_function_or_method' object has no attribute 'func_name'
>>> time.time.__name__ 
'time'

Aussi le double souligne indiquer au lecteur ce est un attribut spécial. En bonus, les classes et les modules ont un __name__ attribut trop, de sorte que vous n'avez souviens d'un nom spécial.

281voto

Albert Vonpupp Points 656

Vous pouvez également utiliser

import sys
this_function_name = sys._getframe().f_code.co_name

41voto

Markus Jarderot Points 33893
my_function.func_name

Il y a aussi d'autres plaisir propriétés des fonctions. Type dir(func_name) à la liste. func_name.func_code.co_code est la fonction compilée, stockées sous forme de chaîne.

import dis
dis.dis(my_function)

affiche le code dans presque format lisible par l'homme. :)

31voto

Demyn Points 305

Cette fonction permet de renvoyer l'appelant du nom de la fonction.

def func_name():
    import traceback
    return traceback.extract_stack(None, 2)[0][2]

C'est comme Albert Vonpupp, en réponse à une wrapper.

12voto

sandyc Points 21

sys._getframe() n'est pas disponible dans toutes les implémentations de Python (voir ref) ,vous pouvez utiliser le traceback module pour faire la même chose, par exemple.

import traceback
def who_am_i():
   stack = traceback.extract_stack()
   filename, codeline, funcName, text = stack[-2]

   return funcName

Un appel à pile[-1] sera de retour le processus actuel de détails.

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