Il est impossible d'obtenir à l'objet fonction intérieure avec le code que vous l'avez dit - ledit objet est créé uniquement (par l'instruction def
) lorsque la fonction externe fonctionne (quand elle est appelé).
En aparté, notez que les fonctions externes comme foo
sont souvent codées à retour la fonction intérieure que leur résultat (par exemple en changeant bar()
-return bar
) comme la dernière ligne, exactement à travailler comme « usines de fonction » (souvent , comme "usines de fermeture") plutôt que de garder l'existence même d'une fonction interne comme une sorte de détail d'implémentation privée et secrète; mais votre codage choisit la dernière route à la place.
Modifier ...:
Il est possible d'obtenir à l'objet de code pour la fonction intérieure, cependant:
>>> def outer():
... def inner(): return 'boo'
... print inner()
...
>>> eval(outer.func_code.co_consts[1])
'boo'
>>>
Cependant, en général, de faire un code objet dans une fonction appelable nécessite un travail considérable (dans ce cas particulier un eval
suffit car la fonction interne n'a pas d'arguments ni de variables non locales, mais bien sûr pas partout même près au cas général ... dans laquelle vous ne devez fournir de telles subtilités comme fixations pour nonlocals -)
La dernière chose que foo n'Invoke bar, pourquoi ne pas simplement appeler foo()? – PaulMcG
@paul parce que foo() fait autre chose que call bar(), ce que je ne veux pas faire. – JesseW
"que je ne peux pas facilement modifier" Souvent faux. Essayez de parler à l'auteur. –