En supposant que j'ai une fonction 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 em> p> maintenant, puis-je savoir qui a été appelé? Je veux déboguer 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 ... em> strong> p> p> p> def f (): Imprimer 0 code> et je souhaite créer une autre fonction g code>, cependant g code> est identique à f code>, donc je viens d'assigner f code> à celui-ci: f () code> uniquement lorsqu'il est appelé via g code>. Le flux est-il différent entre ces 2 appels? P>
4 Réponses :
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 >>>
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 em> vous recommande de faire Cependant, si votre code Suit certains modèles, vous pouvez avoir une chance en consultant heureusement, vous obtiendrez p> Si vous avez des compétences de regex, vous pouvez réellement extraire le nom de la fonction avec un: p> Cependant, vous allez facilement exécuter en difficulté d'identification de la fonction réelle si votre code d'appel devient marginalement em> plus complexe: p> dans tous les exemples ci-dessus, vous avez une difficulté significative à essayer de déterminer Si c'est g code> une autre fonction qui envoie f code>, pour une expérience de débogage moins douloureuse. inspect.scpect.stack () code>: p> f code> ou g code>. p> p>
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 i> travailler pour des cas simples.
Cela ne fonctionnera pas.
entrée: strong> p> 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()')
eval () code> est diabolique
Je suis d'accord. Je viens de jeter une idée là-bas.
Puis-je suggérer la solution la plus simple?
def f():
print 0
def g():
return f()
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 ...
Je crains que tu ne puisses pas.
@meowgoestHedog que dupliquer est invalide, comme
g .__ nom__ == "f" code> où le résultat attendu est"g" code>.@ibug ah ok j'ai mal compris la question