method - python run main
¿Qué hace `__importar__(''pkg_resources''). Declare_namespace(__ name__)` do? (2)
En algunos archivos __init__.py
de módulos, vi esa línea única:
__import__(''pkg_resources'').declare_namespace(__name__)
¿Qué hace y por qué las personas lo usan? Supongamos que está relacionado con la importación dinámica y la creación de espacio de nombres en tiempo de ejecución.
Esta es una forma de declarar los llamados "paquetes de espacios de nombres" en Python.
¿Cuáles son estos y cuál es el problema?
Imagine que distribuye un producto de software que tiene mucha funcionalidad, y no todas las personas lo quieren todo, por lo que se divide en pedazos y se envía como complementos opcionales.
Quieres que la gente pueda hacer
import your_project.plugins.plugin1
import your_project.plugins.plugin2
...
Lo cual está bien si la estructura de su directorio es exactamente como la anterior, es decir
your_project/
__init__.py
plugins/
__init__.py
plugin1.py
plugin2.py
Pero, ¿qué pasa si envía esos dos complementos como paquetes separados de Python para que estén ubicados en dos directorios diferentes? Entonces quizás quiera poner __import__(''pkg_resources'').declare_namespace(__name__)
en cada __import__(''pkg_resources'').declare_namespace(__name__)
de cada paquete para que Python sepa que esos paquetes son parte de un "paquete de espacio de nombres" más grande, en nuestro caso es your_project.plugins
.
Por favor, consulte la documentation para más información.
Se reduce a dos cosas:
__import__
es una función de Python que importará un paquete utilizando una cadena como nombre del paquete. Devuelve un nuevo objeto que representa el paquete importado. Así quefoo = __import__(''bar'')
importará un paquete llamadobar
y almacenará una referencia a sus objetos en una variable de objeto localfoo
.Desde setup pkg_resources'' documentación de
declare_namespace()
,declare_namespace()
"Declare [s] que el nombre del nombre del paquete con puntos es un" paquete de espacios de nombres "cuyos paquetes y módulos contenidos pueden distribuirse en múltiples distribuciones."
Entonces __import__(''pkg_resources'').declare_namespace(__name__)
importará el paquete ''pkg_resources'' en un temporal y llamará a la función declare_namespace
almacenada en ese temporal (es probable que se __import__
función __import__
lugar de la instrucción de import
para que no haya ningún símbolo adicional sobra nombrado pkg_resources
). Si este código estaba en my_namespace/__init__.py
, entonces __name__
es my_namespace
y este módulo se incluirá en el paquete de espacio de nombres my_namespace
.
Consulte la documentación de las pkg_resources'' para obtener más detalles.
Vea esta pregunta para discusión sobre el mecanismo anterior para lograr el mismo efecto.
Vea PEP 420 para el mecanismo estandarizado que proporciona una funcionalidad similar comenzando con Python 3.3.