Obtention de références à des objets fonction sur la pile d'exécution à partir de l'objet frame?

StackOverflow https://stackoverflow.com/questions/1034688

  •  06-07-2019
  •  | 
  •  

Question

Etant donné la sortie de inspect.stack () , est-il possible d'extraire les objets de fonction à partir de n'importe quel cadre de la pile et de les appeler? Si oui, comment?

(Je sais déjà comment obtenir les noms des fonctions.)

Voici ce à quoi je veux en venir: disons que je suis une fonction et que j'essaie de déterminer si mon appelant est un générateur ou une fonction normale? J'ai besoin d'appeler inspect.isgeneratorfunction () sur l'objet fonction. Et comment savez-vous qui vous a appelé? inspect.stack () , n'est-ce pas? Donc, si je peux les assembler d'une manière ou d'une autre, j'aurai la réponse à ma question. Peut-être y a-t-il un moyen plus facile de faire cela?

Était-ce utile?

La solution

Voici un extrait de code qui le fait. Il n'y a pas d'erreur de vérification. L'idée est de trouver dans les sections locales du grand parent l'objet de fonction appelé. L'objet de fonction renvoyé doit être le parent. Si vous souhaitez également effectuer une recherche dans les commandes intégrées, recherchez simplement les piles [2] [0] .f_builtins.

def f():
    stacks  = inspect.stack()
    grand_parent_locals = stacks[2][0].f_locals
    caller_name = stacks[1][3]
    candidate = grand_parent_locals[caller_name]

Dans le cas d’une classe, on peut écrire ce qui suit (inspiré par la solution de Marcin)

class test(object):
    def f(self):
        stack = inspect.stack()
        parent_func_name = stack[1][3]
        parent_func = getattr(self, parent_func_name).im_func

Autres conseils

J'ai adopté l'approche suivante, très similaire à la réponse d'Eolmar.

stack = inspect.stack()
parent_locals = stack[1][0].f_locals['self']
parent_func_name = stack[1][3]
parent_func_attr = getattr(parent_locals,parent_func_name)
parent_func = parent_func_attr.im_func
is_parent_gen = inspect.isgeneratorfunction(func)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top