run method def _main_ python module namespaces runtime

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:

  1. __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í que foo = __import__(''bar'') importará un paquete llamado bar y almacenará una referencia a sus objetos en una variable de objeto local foo .

  2. 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.