Si vous avez 2 fonctions comme :
def A
def B
et A appelle B, pouvez-vous obtenir qui appelle B à l'intérieur de B, comme :
def A () :
B ()
def B () :
this.caller.name
Si vous avez 2 fonctions comme :
def A
def B
et A appelle B, pouvez-vous obtenir qui appelle B à l'intérieur de B, comme :
def A () :
B ()
def B () :
this.caller.name
Vous pouvez utiliser le inspecter pour obtenir les informations souhaitées. Son pile renvoie une liste d'enregistrements de cadres.
Pour Python 2 chaque enregistrement de trame est une liste. Le troisième élément de chaque enregistrement est le nom de l'appelant. Voici ce que vous voulez :
>>> import inspect
>>> def f():
... print inspect.stack()[1][3]
...
>>> def g():
... f()
...
>>> g()
g
Pour Python 3.5 et plus chaque enregistrement de trame est un tuple nommé vous devez donc remplacer
print inspect.stack()[1][3]
avec
print(inspect.stack()[1].function)
sur le code ci-dessus.
Sur python 3.4 au moins, cela ne fonctionne pas, ils ont changé l'ordre des tuples. Un tuple nommé est maintenant utilisé, il est donc préférable d'utiliser inspect.stack()[1].filename
En fait, vous voulez probablement inspect.currentframe().f_back.f_code.co_name
qui est indépendant de la version ou de l'implémentation de Python.
@1313e : aussi inspect.currentframe()
dépend de l'implémentation de Python, puisque si vous lisez le code source de inspect.py
ils utilisent tous deux sys._getframe()
Il y a deux façons de procéder, en utilisant sys
y inspect
modules :
sys._getframe(1).f_code.co_name
inspect.stack()[1][3]
En stack()
est moins lisible et dépend de l'implémentation puisqu'elle appelle sys._getframe()
voir l'extrait de inspect.py
:
def stack(context=1):
"""Return a list of records for the stack above the caller's frame."""
return getouterframes(sys._getframe(1), context)
Note (juin 2018) : aujourd'hui, j'utiliserais probablement . inspect
module, voir les autres réponses
sys._getframe(1).f_code.co_name
comme dans l'exemple ci-dessous :
>>> def foo():
... global x
... x = sys._getframe(1)
...
>>> def y(): foo()
...
>>> y()
>>> x.f_code.co_name
'y'
>>>
Note importante : comme il est évident dans l'image de l _getframe
(hé, ça commence par un trait de soulignement), il ne s'agit pas d'une méthode de l'API à laquelle il faut se fier sans réfléchir.
sys._getframe n'est "pas garanti d'exister dans toutes les implémentations de Python" - je pense que c'est important à noter.
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.
1 votes
Vous avez la source disponible. Pourquoi auriez-vous besoin d'une telle chose ?
39 votes
Parce que je débogue le code dans l'interpréteur python d'une application tierce où il n'y a pas de véritable débogueur.
0 votes
En rapport : Comment enregistrer le nom du fichier source et le numéro de ligne en Python ? .
1 votes
Marquer ceci comme le doublon puisque l'autre a plus de vues et de upvotes sur la question.