En Python, comment puis-je obtenir un nom de 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 sortir "my_function"
.
Une telle fonction est-elle disponible en Python? Sinon, des idées sur la façon de mettre en œuvre get_function_name_as_string
, en Python?
Réponses:
L'utilisation
__name__
est la méthode préférée car elle s'applique uniformément. Contrairement àfunc_name
cela, il fonctionne également sur les fonctions intégrées:Les doubles soulignements indiquent également au lecteur qu'il s'agit d'un attribut spécial. En prime, les classes et les modules ont aussi un
__name__
attribut, donc vous n'avez qu'un seul nom spécial à retenir.la source
def wrapper(kwargs): super(ExtendedClass,self).call('wrapper', kwargs)
. Vous avez un autre choix, ce qui est:def wrapper(kwargs): super(ExtendedClass,self).call(sys._getframe().f_code.co_name, kwargs)
. Ainsi, la réponse d'Albert Vonpupp me semble meilleure.f.__name__ == 'f'
.Pour obtenir le nom de la fonction ou de la méthode actuelle de l'intérieur, considérez:
sys._getframe
fonctionne également au lieu deinspect.currentframe
bien que ce dernier évite d'accéder à une fonction privée.Pour obtenir le nom de la fonction appelante à la place, considérez
f_back
comme dansinspect.currentframe().f_back.f_code.co_name
.S'il utilise également
mypy
, il peut se plaindre que:Pour supprimer l'erreur ci-dessus, envisagez:
la source
sys._getframe
- il est directement connecté aux composants internes de CPython.sys._getframe(1).f_code.co_name
, afin que vous puissiez définir une fonction commeget_func_name()
et vous attendre à obtenir le nom souhaité de la fonction qui a invoqué.Il existe également d'autres propriétés amusantes des fonctions. Tapez
dir(func_name)
pour les répertorier.func_name.func_code.co_code
est la fonction compilée, stockée sous forme de chaîne.affichera le code dans un format lisible par presque l'homme. :)
la source
__names__
sont privés,__names
sont spéciaux._names
privé (simple soulignement avant, juste une convention),__names__
spécial (double soulignement avant et après). Je ne sais pas si le double soulignement avant a un sens, formellement ou comme convention.func_name
n'existe plus en python3 donc vous devez utiliserfunc.__name__
si vous voulez la compatibilitéCette fonction renverra le nom de la fonction de l'appelant.
C'est comme la réponse d'Albert Vonpupp avec un emballage convivial.
la source
Si vous êtes intéressé par les méthodes de classe aussi, Python 3.3+ a
__qualname__
en plus__name__
.la source
J'aime utiliser un décorateur de fonction. J'ai ajouté une classe, qui multiplie également le temps de la fonction. Supposons que gLog est un enregistreur Python standard:
maintenant tout ce que vous avez à faire avec votre fonction est de le décorer et le tour est joué
la source
où
stack () [0] l'appelant
stack () [3] le nom de chaîne de la méthode
la source
stack()[0]
sera toujours l'appelant,[3]
le nom de chaîne de la méthode.Dans le prolongement de la réponse de @ Demyn , j'ai créé des fonctions utilitaires qui affichent le nom de la fonction actuelle et les arguments de la fonction actuelle:
la source
sys._getframe()
n'est pas garanti d'être disponible dans toutes les implémentations de Python ( voir ref ), vous pouvez utiliser letraceback
module pour faire la même chose, par exemple.Un appel à
stack[-1]
renverra les détails du processus en cours.la source
sys._getframe()
n'est pas défini, iltraceback.extract_stack
est également inutilisable. Ce dernier fournit un surensemble grossier de la fonctionnalité du premier; vous ne pouvez pas vous attendre à voir l'un sans l'autre. Et en fait, dans IronPython 2.7extract_stack()
revient toujours[]
. -1Vous voulez juste obtenir le nom de la fonction, voici un code simple pour cela. disons que vous avez défini ces fonctions
la sortie sera function1
Maintenant, disons que vous avez ces fonctions dans une liste
pour obtenir le nom des fonctions
la sortie sera
fonction1
fonction2
fonction3
la source
J'ai vu quelques réponses qui utilisaient des décorateurs, même si je trouvais que certaines étaient un peu bavardes. Voici quelque chose que j'utilise pour enregistrer les noms de fonction ainsi que leurs valeurs d'entrée et de sortie respectives. Je l'ai adapté ici pour simplement imprimer les informations plutôt que de créer un fichier journal et je l'ai adapté pour l'appliquer à l'exemple spécifique OP.
Production:
la source
debug
fonction une fois que vous pouvez ajouter la fonctionnalité en ajoutant simplement le décorateur à la fonction dont vous avez besoin ou souhaitez imprimer le nom de la fonction. Il semble que ce soit le plus simple et le plus adaptable.