¿Qué es una statement de nivel superior en Python?

En el capítulo de la guía de Python sobre la estructura del proyecto , el término “statement de nivel superior” aparece varias veces. No estoy seguro de a qué se refiere esto. Supongo que las declaraciones de variables que suceden fuera de cualquier función o método de clase se activan tan pronto como se carga un módulo. ¿Es esto correcto? ¿También incluye las instrucciones de import un módulo?

No son solo declaraciones de variables (y de todas formas no hay declaraciones de variables). Es casi cualquier cosa que comienza en el nivel de sangría 0.

 import sys # top-level 3 + 4 # top-level x = 0 # top-level def f(): # top-level import os # not top-level! return 3 # not top-level if x: # top-level print 3 # not top-level else: print 4 # not top-level, but executes as part of an if statement # that is top-level class TopLevel(object): # top-level x = 3 # not top-level, but executes as part of the class statement def foo(self): # not top-level, but executes as part of the class statement print 5 # not top-level 

Creo que lo tienes exactamente correcto, y sí, eso incluiría las declaraciones de importación.

Aquí está la primera mención de “statement de alto nivel”:

Una vez que se encuentra modu.py, el intérprete de Python ejecutará el módulo en un ámbito aislado. Se ejecutará cualquier statement de nivel superior en modu.py, incluidas otras importaciones, si las hubiera. Las definiciones de funciones y clases se almacenan en el diccionario del módulo.

Esto deja claro que lo que realmente quieren decir es “cosas que se interpretan en el momento de la import “.

Si bien no es muy útil directamente, la documentación de Python también utiliza la frase “nivel superior” (componentes, que luego significa “declaraciones” en este contexto).

Tenga en cuenta que este módulo:

 """a python module, spam.py""" def spam(): return "spam" class Spam(object): pass 

tiene dos afirmaciones, la def y la class . Ambos se ejecutan en el momento de la importación. Estas definiciones son declaraciones compuestas (ver descripciones de def y class ). Si hay decoradores vinculados a una def nivel superior, eso agrega aún más cosas de nivel superior para ejecutar. (Ver también la respuesta de user2357112 : ejecutar una statement de class invoca más trabajos internos).

Agregue un sistema de import sys en la parte superior y ha agregado una tercera statement, que importa sys . Sin embargo, si añades esto:

 def ham(eggs): import os return os.path.basename(eggs) 

todavía solo has agregado una statement, la def ham , a las cosas de nivel superior. Es cuando se ejecuta (llama) el mismo ham se ejecutará el sistema import os .