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
.