949 votes

Comment obtenir le nom de la fonction sous forme de chaîne en Python ?

En Python, comment obtenir le nom de la fonction sous forme de chaîne sans appeler la fonction ?

def my_function():
    pass

print get_function_name_as_string(my_function) # my_function is not in quotes

devrait produire "my_function" .

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

1235voto

user28409 Points 6460
my_function.__name__

Utilisation de __name__ est la méthode préférée car elle s'applique uniformément. Contrairement à func_name il fonctionne également sur les fonctions intégrées :

>>> 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'

De plus, le double soulignement indique au lecteur qu'il s'agit d'un attribut spécial. En prime, les classes et les modules ont un __name__ également, de sorte que vous ne devez retenir qu'un seul nom spécial.

363voto

Albert Vonpupp Points 656

Vous pouvez également utiliser

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

47voto

Markus Jarderot Points 33893
my_function.func_name

Il existe également d'autres propriétés amusantes des fonctions. Type dir(func_name) pour les énumérer. func_name.func_code.co_code est la fonction compilée, stockée sous forme de chaîne.

import dis
dis.dis(my_function)

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

36voto

Demyn Points 305

Cette fonction renvoie le nom de la fonction de l'appelant.

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

C'est comme la réponse d'Albert Vonpupp avec un emballage sympathique.

17voto

sandyc Points 21

Il n'est pas garanti que sys._getframe() soit disponible dans toutes les implémentations de Python ( voir référence ) ,vous pouvez utiliser le module traceback 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 à stack[-1] renverra les détails du processus actuel.

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