2012-07-31 16 views
6

que tienen una estructura de paquetes de la siguiente manera:¿Por qué no se pueden declarar los atributos de acceso a los módulos en __init__.py de su paquete?

mypackage 
    __init__.py 
    mymodule.py 

os pongo unas declaraciones "constantes" en __init__.py por ejemplo:

DELIMITER='\x01' 

Sin embargo, el código de la mymodule.py no puede acceso a menos DELIMITER agrego:

from __init__ import * 

En la parte superior de la m ymodule.py archivo. Supongo que me perdí un concepto aquí. ¿Es que lo que se declara en __init__.py no se lee en la memoria hasta que se accede a través de una declaración de importación? Además, ¿es este un tipo típico de cosas para poner en el archivo __init__.py?

+4

¿De dónde sacó la impresión de que funcionaría sin la declaración 'import'? –

+0

@DavidRobinson: De la documentación de Python. ["__init__.py Inicializar el paquete de sonido"] (http://docs.python.org/tutorial/modules.html#packages). No estoy seguro de qué otra manera interpretaría lo que dicen allí, excepto suponiendo que Python inicie el código en __init__.py. –

Respuesta

5

Python ejecuta el código en __init__.py cuando se importa el paquete, lo que permite realizar una cierta inicialización. Sin embargo, solo porque se ejecuta no significa que tenga acceso a las variables desde otros módulos.

Por ejemplo:

testpackage 
    __init__.py 
    testmod.py 

Digamos __init__.py tiene el código print "Initializing __init__", y testmod.py tiene print "Initializing testmod". En ese caso, la importación o testpackagetestmod haría que el código de inicialización que se ejecute:

dynamic-oit-vapornet-c-499:test dgrtwo$ python -c "import testpackage" 
Initializing __init__ 
dynamic-oit-vapornet-c-499:test dgrtwo$ python -c "from testpackage import testmod" 
Initializing __init__ 
Initializing testmod 

Se no, sin embargo, dan testmod.py acceso a las variables de __init__.py. Esto tiene que hacerse de forma explícita.

+1

Gracias. Ahora lo entiendo. Nunca se sabe qué es magia y qué no hasta que lo hayas probado una vez. :) –

2

Los paquetes no agrupan de alguna manera todos los módulos en ellos. No hay ninguna razón para que las cosas en __init__ sean accesibles en los otros módulos a menos que lo importe.

Cuestiones relacionadas