Estoy intentando organizar algunos módulos para mi propio uso. Tengo algo como esto:
lib/
__init__.py
settings.py
foo/
__init__.py
someobject.py
bar/
__init__.py
somethingelse.py
En lib/__init__.py
, quiero definir algunas clases que se usarán si importo lib. Sin embargo, parece que no puedo resolverlo sin separar las clases en archivos e importarlos __init__.py
.
En lugar de decir:
lib/
__init__.py
settings.py
helperclass.py
foo/
__init__.py
someobject.py
bar/
__init__.py
somethingelse.py
from lib.settings import Values
from lib.helperclass import Helper
Quiero algo como esto:
lib/
__init__.py #Helper defined in this file
settings.py
foo/
__init__.py
someobject.py
bar/
__init__.py
somethingelse.py
from lib.settings import Values
from lib import Helper
¿Es posible o tengo que separar la clase en otro archivo?
EDITAR
OK, si importo lib desde otro script, puedo acceder a la clase Helper. ¿Cómo puedo acceder a la clase Helper desde settings.py?
El ejemplo aquí describe las referencias dentro del paquete. Cito "los submódulos a menudo necesitan referirse entre sí". En mi caso, lib.settings.py necesita el Helper y lib.foo.someobject necesita acceso al Helper, entonces, ¿dónde debería definir la clase Helper?
Respuestas:
'
lib/
'S directorio principal debe estar ensys.path
.Su '
lib/__init__.py
' podría verse así:Entonces el siguiente ejemplo debería funcionar:
Responda a la versión editada de la pregunta:
__init__.py
define cómo se ve su paquete desde el exterior. Si necesita usarHelper
ensettings.py
, definaHelper
en un archivo diferente, por ejemplo, "lib/helper.py
".El comando:
Salida:
fuente
Si
lib/__init__.py
define la clase Helper, en settings.py puede usar:Esto funciona porque. es el directorio actual y actúa como sinónimo del paquete lib desde el punto de vista del módulo de configuración. Tenga en cuenta que no es necesario exportar Helper a través de
__all__
.(Confirmado con python 2.7.10, que se ejecuta en Windows).
fuente
Simplemente póngalos en __init__.py.
Entonces, con test / classes.py siendo:
... y prueba / __ init__.py siendo:
Puede importar la prueba y tener acceso a A, B y Helper
fuente
Agrega algo como esto a
lib/__init__.py
from .helperclass import Helper
ahora puedes importarlo directamente:
from lib import Helper
fuente
Editar, ya que entendí mal la pregunta:
Solo ingresa la
Helper
clase__init__.py
. Eso es perfectamente pitónico. Se siente extraño viniendo de lenguajes como Java.fuente
Sí, es posible. Es posible que también desee definir
__all__
en__init__.py
archivos. Es una lista de módulos que se importarán cuando lo hagafuente
Quizás esto podría funcionar:
fuente