-1
votes

puis-je savoir si une fonction est appelée directement ou via une variable attribuée

En supposant que j'ai une fonction def f (): Imprimer 0 et je souhaite créer une autre fonction g , cependant g est identique à f , donc je viens d'assigner f à celui-ci: xxx

vous pouvez demander si elles sont identiques, si elles sont identiques, Pourquoi utiliser 2 fonctions, et c'est parce que logiquement, ils représentent 2 choses différentes

maintenant, puis-je savoir qui a été appelé? Je veux déboguer f () uniquement lorsqu'il est appelé via g . Le flux est-il différent entre ces 2 appels?

la suggestion DUP n'a rien à voir avec ma question. Je connais le nom de la fonction, car une seule fonction existe. J'espère juste avoir une étape plus loin et comprendre si une variable ayant la même valeur que le nom de la fonction a été déclenchée ...


3 commentaires

Je crains que tu ne puisses pas.


@meowgoestHedog que dupliquer est invalide, comme g .__ nom__ == "f" où le résultat attendu est "g" .


@ibug ah ok j'ai mal compris la question


4 Réponses :


0
votes

Il n'y a aucun moyen de le faire sans assister supplémentaire ni analyse de code.

Même la pile n'est pas au courant du nom appelé: P>

>>> def a(): traceback.print_stack()
... 
>>> b = a
>>> a()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in a
>>> b()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in a
>>> 


0 commentaires

2
votes

Non, vous ne pouvez pas, du moins pas de cette façon, comme Python ne suit pas "quelle référence à l'objet est regardé". Je fortement vous recommande de faire g une autre fonction qui envoie f , pour une expérience de débogage moins douloureuse.

Cependant, si votre code Suit certains modèles, vous pouvez avoir une chance en consultant inspect.scpect.stack () : xxx

heureusement, vous obtiendrez xxx

Si vous avez des compétences de regex, vous pouvez réellement extraire le nom de la fonction avec un: xxx

Cependant, vous allez facilement exécuter en difficulté d'identification de la fonction réelle si votre code d'appel devient marginalement plus complexe: xxx

dans tous les exemples ci-dessus, vous avez une difficulté significative à essayer de déterminer Si c'est f ou g .


2 commentaires

Je m'abstiendrai d'atrocités telles que cette f (g (h ()))


@Cisforcookies Bien, toujours, je vous recommande de t'alloner si vous voulez cela à des fins de débogage. Mais de toute façon, ma solution devrait travailler pour des cas simples.



1
votes

Cela ne fonctionnera pas.

entrée: strong> p> xxx pré>

SORTIE: strong> p> XXX PRE>

Seule la solution de contournement Je peux penser créerait un type de wrapper autour des fonctions qui appellent l'évaluation et la manipulation de cette façon (mais il n'a probablement pas de sens pour ce que vous voudrez faire) . Ensuite, vous pouvez appeler cet emballage avec un argument de func_name. P>

func_name = 'f'

if func_name =='f':
    ## you know f was called
    eval('f()')


2 commentaires

eval () est diabolique


Je suis d'accord. Je viens de jeter une idée là-bas.



0
votes

Puis-je suggérer la solution la plus simple?

def f():
    print 0


def g():
   return f()


3 commentaires

Je suis d'accord sur une forte probabilité que cette décision de conception est élevée, mais cela ne répond pas à la question des OPS.


@ user2263572 dépend de la partie que vous considérez comme "la question". Cela ne répond pas à la question de la question en effet, mais répond parfaitement à la finale "Maintenant, puis-je savoir qui a été appelé? Je veux déboguer f () seulement quand il est appelé via g" un ;-)


C'est en fait une solution très simple et bonne. Je suis tombé amoureux de la capacité d'affecter des fonctions aux variables et de superviser les bases ...