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__.pydefine cómo se ve su paquete desde el exterior. Si necesita usarHelperensettings.py, definaHelperen un archivo diferente, por ejemplo, "lib/helper.py".. | `- import_submodule.py `- lib | - __init__.py | - foo | | - __init__.py | `- someobject.py | - helper.py `- settings.py 2 directorios, 6 archivosEl comando:
Salida:
fuente
Si
lib/__init__.pydefine 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__.pyfrom .helperclass import Helperahora puedes importarlo directamente:
from lib import Helperfuente
Editar, ya que entendí mal la pregunta:
Solo ingresa la
Helperclase__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__.pyarchivos. Es una lista de módulos que se importarán cuando lo hagafuente
Quizás esto podría funcionar:
fuente