tutorial org book python python-module python-internals

org - python eval



¿Cómo se define la variable__name__ en un módulo de Python? (2)

Soy consciente del ejemplo estándar : si ejecuta un módulo directamente, entonces __name__ la variable global se define como "__main__" . Sin embargo, en ninguna parte de la documentación puedo encontrar una descripción precisa de cómo se define __name__ en el caso general. La documentación del módulo dice ...

Dentro de un módulo, el nombre del módulo (como una cadena) está disponible como el valor de la variable global __name__ .

... pero ¿qué significa "nombre del módulo"? ¿Es solo el nombre del módulo (el nombre de archivo con .py eliminado), o también incluye el nombre del paquete completo?

¿Cómo se determina el valor de la variable __name__ en un módulo de Python? Para los puntos de bonificación, indique con precisión dónde se realiza esta operación en el código fuente de Python.


La variable __name__ es un atributo del módulo al que se podría acceder por su nombre.

import os assert os.__name__ == ''os''

Ejemplo de módulo creado por uno mismo que escanea el mecanismo de importación:

>>> import types >>> m = types.ModuleType("name of module") # create new module with name >>> exec "source_of_module = __name__" in m.__dict__ # execute source in module >>> m.source_of_module ''name of module''

Líneas de módulo de tipos:

import sys ModuleType = type(sys)


Se establece en el nombre absoluto del módulo como importado. Si lo importó como foo.bar , entonces __name__ se establece en ''foo.bar'' .

El nombre se determina en el módulo import.c , pero como ese módulo maneja varios tipos diferentes de importaciones (incluidas las importaciones zip, las importaciones de solo bytecode y los módulos de extensión) hay varias rutas de código para rastrear.

Normalmente, las declaraciones de import se convierten en una llamada a __import__ , que se implementa de forma predeterminada como una llamada a PyImport_ImportModuleLevelObject . Consulte la documentación __import__() para tener una idea de lo que significan los argumentos. Dentro de PyImport_ImportModuleLevelObject nombres relativos se resuelven, por lo que puede PyImport_ImportModuleLevelObject las variables de name allí si lo desea.

El resto del módulo maneja las importaciones reales, con PyImport_AddModuleObject creando el objeto de espacio de nombres real y configurando la clave de name , pero puede rastrear ese valor de name a PyImport_ImportModuleLevelObject . Al crear un objeto de módulo, su valor __name__ se establece en el constructor de objetos moduleobject.c .