web-dev-qa-db-fra.com

Déclarez la fonction à la fin du fichier dans Python

Est-il possible d'appeler une fonction sans d'abord la définir complètement? En tentant ceci, j'obtiens l'erreur: "nom_fonction n'est pas défini". Je viens d'un arrière-plan C++ donc ce problème me bloque.

Déclaration de la fonction avant travaux:

def Kerma():
        return "energy / mass"    

print Kerma()

Cependant, tenter d'appeler la fonction sans la définir au préalable pose problème:

print Kerma()

def Kerma():
    return "energy / mass"

En C++, vous pouvez déclarer une fonction après l'appel une fois que vous placez son en-tête devant elle.

Est-ce que j'ai râté quelque chose?

69
TheGentleOne

Une façon qui est en quelque sorte idiomatique dans Python écrit:

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __== '__main__':
    main()

Cela vous permet d'écrire votre code dans l'ordre que vous souhaitez tant que vous continuez d'appeler la fonction main à la fin.

116
Muhammad Alkarouri

Lorsqu'un module Python (fichier .py) est exécuté, les instructions de niveau supérieur sont exécutées dans l'ordre dans lequel elles apparaissent, de haut en bas (du début à la fin). Cela signifie que vous pouvez ' t référence quelque chose jusqu'à ce que vous l'ayez défini. Par exemple, ce qui suit générera l'erreur affichée:

c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17

Contrairement à de nombreux autres langages, les instructions def et class sont exécutables en Python - et pas seulement déclaratives - vous ne pouvez donc pas référencer a ou b tant que cela se produit et ils sont définis. C'est pourquoi votre premier exemple a des problèmes: vous faites référence à la fonction Kerma() avant que son instruction def ne soit exécutée et que le corps ait été traité et que l'objet de fonction résultant soit lié au nom de la fonction, donc il n'est pas défini à ce stade du script.

Les programmes dans des langages comme C++ sont généralement prétraités avant d'être exécutés et pendant cette étape de compilation, le programme entier et tous les fichiers #include Auxquels il fait référence sont lus et traités en une seule fois. Contrairement à Python, ce langage comporte des instructions déclaratives qui permettent au nom et à la séquence d'appel de fonctions (ou de type statique de variables) d'être déclarés (mais non définis), avant utilisation afin que lorsque le compilateur rencontre leur nom, il dispose de suffisamment d'informations pour vérifier leur l'utilisation, qui implique principalement la vérification de type et les conversions de type, dont aucune n'exige que leur contenu ou corps de code réel ait été défini pour le moment.

15
martineau

Ce n'est pas possible en Python, mais franchement, vous constaterez bientôt que vous n'en avez pas du tout besoin. La façon Pythonique d'écrire du code consiste à diviser votre programme en modules qui définissent les classes et les fonctions, et un seul "module principal" qui importe tous les autres et s'exécute.

Pour les scripts jetables simples, habituez-vous à placer la "partie exécutable" à la fin, ou mieux encore, apprenez à utiliser un shell interactif Python.

9
Eli Bendersky

Python est un langage dynamique et l'interpréteur prend toujours l'état des variables (fonctions, ...) telles qu'elles sont au moment de les appeler. Vous pouvez même redéfinir les fonctions dans certains blocs if et les appeler à chaque fois différemment. C'est pourquoi vous devez les définir avant de les appeler.

1
eumiro