2011-10-16 19 views
36

En algunos __init__.py archivos de módulos vi como una sola línea:¿Qué hace `__importar __ ('pkg_resources'). Declare_namespace (__ name __)` do?

__import__('pkg_resources').declare_namespace(__name__) 

¿Qué hacer y qué personas lo utilizan? Supongamos que está relacionado con la importación dinámica y la creación de espacio de nombres en tiempo de ejecución.

+1

Usted puede encontrar esta pregunta y respuesta es útil: http://stackoverflow.com/questions/5064951/packaging-common-python-namespaces –

Respuesta

34

Se reduce a dos cosas:

  1. __import__ es una función de Python que importar un paquete mediante una cadena como el nombre del paquete. Devuelve un nuevo objeto que representa el paquete importado. Por lo tanto, foo = __import__('bar') importará un paquete llamado bar y almacenará una referencia a sus objetos en una variable de objeto local foo.

  2. De la documentación de configuración utils pkg_resources', declare_namespace() "Declarar [s] que el nombre el nombre del paquete de puntos es un 'paquete de espacio de nombres' cuyos paquetes y módulos contenida puede propagarse a través de múltiples distribuciones."

Así __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 temporales (la función __import__ es probable que se utiliza en lugar de la declaración import de manera que no hay ningún símbolo adicional de sobra llamado 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 para más detalles setup tools

Ver this question para el debate sobre el mecanismo mayores para lograr el mismo efecto.

Ver PEP 420 para el mecanismo estandarizado que proporciona una funcionalidad similar comenzando con Python 3.3.

+0

__import__ es una función de Python, no una afirmación. –

+0

@PierreThibault Solucionado. ¡Gracias! – Nathan

+0

¿Qué? ¡No! Eso no es lo que hace 'declare_namespace' en absoluto. No solo descarga los contenidos del módulo 'pkg_resources' en el espacio de nombres elegido; 'pkg_resources' es solo el módulo de donde proviene' declare_namespace'. Un paquete 'foo' usaría' pkg_resources.declare_namespace (__ name __) 'para permitir que su implementación se divida en múltiples carpetas' foo'. Traer los contenidos de 'pkg_resources' en sí a tu espacio de nombres sería totalmente contraproducente. – user2357112

4

Esta es una forma de declarar los llamados "paquetes de espacios de nombres" en Python.

¿Qué es esto y cuál es el problema:

Imagínese que distribuye un producto de software que tiene una gran cantidad de funcionalidad, y no todas las personas que quieren todos de la misma, por lo que se dividió en pedazos y buques complementos opcionales .

¿Quieres que la gente sea capaz de hacer

import your_project.plugins.plugin1 
import your_project.plugins.plugin2 
... 

que está bien si la estructura de directorios es exactamente como antes, es decir

your_project/ 
    __init__.py 
    plugins/ 
     __init__.py 
     plugin1.py 
     plugin2.py 

Pero lo que si usted envía estos dos plugins como pitón separada paquetes para que estén ubicados en dos directorios diferentes? Entonces puede poner __import__('pkg_resources').declare_namespace(__name__) en cada paquete __init__.py 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.

Consulte el documentation para obtener más información.

0

Nathan, esta descripción parece incorrecto: "Así __import__('pkg_resources').declare_namespace(__name__) importará todos los símbolos del paquete pkg_resources y luego añadirlos a un espacio de nombres cuyo nombre se almacena en __name__."

declare_namespace no agrega símbolos del paquete pkg_resources al espacio de nombre cuyo nombre está almacenado en __name__.

declare_namespace hace lo siguiente: "Declara que el paquete 'packageName' es un paquete de espacio de nombres". Referencia: http://galaxy.readthedocs.io/en/master/lib/pkg_resources.html#pkg_resources.declare_namespace

+0

Sí, yo y @ user2357112 tenemos razón. Actualicé mi respuesta para reflexionar. – Nathan

Cuestiones relacionadas