115 votes

Déclarer une fonction à la fin d'un fichier en Python

Est-il possible d'appeler une fonction sans la définir complètement au préalable ? Lorsque j'essaie de le faire, j'obtiens l'erreur suivante " nom_de_la_fonction n'est pas défini". Je viens d'un milieu C++ et ce problème me laisse perplexe.

La déclaration de la fonction avant fonctionne :

def Kerma():
        return "energy / mass"    

print Kerma()

Toutefois, si l'on tente d'appeler la fonction sans l'avoir définie au préalable, cela pose problème :

print Kerma()

def Kerma():
    return "energy / mass"

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

Ai-je raté quelque chose ?

187voto

Muhammad Alkarouri Points 8463

L'une des méthodes idiomatiques en Python est l'écriture :

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

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

20voto

martineau Points 21665

Lorsqu'un module Python (fichier .py) est exécuté, les instructions de premier niveau qu'il contient sont exécutées dans l'ordre dans lequel elles apparaissent, de haut en bas (du début à la fin). Cela signifie que vous ne pouvez pas faire référence à quelque chose avant de l'avoir défini. Par exemple, l'énoncé suivant générera l'erreur indiquée :

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

Contrairement à de nombreuses autres langues, def y class sont exécutables en Python - et pas seulement déclaratives - et vous ne pouvez donc pas faire référence à l'un ou l'autre des éléments suivants a o b jusqu'à ce que cela se produise et qu'ils soient définis. C'est la raison pour laquelle votre premier exemple pose problème - vous faites référence à l'élément Kerma() avant sa fonction def a été exécutée et le corps a été traité, et l'objet fonction résultant est lié au nom de la fonction, qui n'est donc pas définie à ce stade dans le script.

Les programmes dans des langages comme le C++ sont généralement prétraités avant d'être exécutés et, au cours de cette phase de compilation, l'ensemble du programme et tous les éléments qui le composent sont traités. #include les fichiers auxquels il se réfère sont lus et traités en une seule fois. Contrairement à Python, ce langage comporte des déclarations qui permettent de déclarer (mais pas de définir) le nom et la séquence d'appel des fonctions (ou le type statique des variables) avant leur utilisation, de sorte que lorsque le compilateur rencontre leur nom, il dispose de suffisamment d'informations pour vérifier leur utilisation, ce qui implique principalement la vérification du type et les conversions de type, sans qu'il soit nécessaire de définir leur contenu réel ou le corps du code.

15voto

Eli Bendersky Points 82298

Ce n'est pas possible en Python, mais franchement, vous vous rendrez vite compte que vous n'en avez pas besoin du tout. La méthode Python pour écrire du code consiste à diviser votre programme en modules qui définissent des classes et des fonctions, et en un seul "module principal" qui importe tous les autres et s'exécute.

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

8voto

arye Points 57

Si vous voulez être comme le C++ et utiliser tout à l'intérieur d'une fonction, vous pouvez appeler la première fonction depuis le bas du fichier, comme ceci :

def main():
    print("I'm in main")
    #calling a although it is in the bottom
    a()

def b():
   print("I'm in b")

def a():
   print("I'm in a")
   b()

main()

De cette façon, python "lit" d'abord le fichier entier et commence ensuite l'exécution.

5voto

eumiro Points 56644

Python est un langage de programmation dynamique et l'interpréteur prend toujours l'état des variables (fonctions,...) tel qu'il est au moment où il les appelle. Vous pourriez même redéfinir les fonctions dans quelques blocs if et les appeler à chaque fois différemment. C'est pourquoi vous devez les définir avant de les appeler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X