from another __all__ python packages

python - another - Cómo importar clases definidas en__init__.py



python import module from path (7)

Estoy tratando de 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 para usar si importo lib. Sin embargo, parece que no puedo resolverlo sin separar las clases en archivos e importarlas en __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

De acuerdo, si importo lib de otro script, puedo acceder a la clase Helper. ¿Cómo puedo acceder a la clase Helper desde settings.py?

El ejemplo here describe las referencias dentro del paquete. Cito "los submódulos a menudo necesitan referirse el uno al otro". En mi caso, lib.settings.py necesita el Helper y lib.foo.someobject necesita acceso a Helper, entonces, ¿dónde debería definir la clase Helper?


  1. '' lib/ '' s directorio principal debe estar en sys.path .

  2. Su '' lib/__init__.py '' podría verse así:

    from . import settings # or just ''import settings'' on old Python versions class Helper(object): pass

Entonces el siguiente ejemplo debería funcionar:

from lib.settings import Values from lib import Helper

Responda a la versión editada de la pregunta:

__init__.py define cómo se ve tu paquete desde afuera. Si necesita utilizar Helper en settings.py entonces defina Helper en un archivo diferente, por ejemplo, '' lib/helper.py ''.

. | `-- import_submodule.py `-- lib |-- __init__.py |-- foo | |-- __init__.py | `-- someobject.py |-- helper.py `-- settings.py 2 directories, 6 files

El comando:

$ python import_submodule.py

Salida:

settings helper Helper in lib.settings someobject Helper in lib.foo.someobject # ./import_submodule.py import fnmatch, os from lib.settings import Values from lib import Helper print for root, dirs, files in os.walk(''.''): for f in fnmatch.filter(files, ''*.py''): print "# %s/%s" % (os.path.basename(root), f) print open(os.path.join(root, f)).read() print # lib/helper.py print ''helper'' class Helper(object): def __init__(self, module_name): print "Helper in", module_name # lib/settings.py print "settings" import helper class Values(object): pass helper.Helper(__name__) # lib/__init__.py #from __future__ import absolute_import import settings, foo.someobject, helper Helper = helper.Helper # foo/someobject.py print "someobject" from .. import helper helper.Helper(__name__) # foo/__init__.py import someobject


Agregue algo como esto a lib/__init__.py

from .helperclass import Helper

ahora puedes importarlo directamente:

from lib import Helper


Editar, ya que entendí mal la pregunta:

Simplemente ponga la clase Helper en __init__.py . Eso es perfectamente pitónico. Simplemente parece extraño venir de idiomas como Java.


Quizás esto podría funcionar:

import __init__ as lib


Sí, es posible. También es posible que desee definir __all__ en __init__.py archivos. Es una lista de módulos que se importarán cuando lo haga

from lib import *


Si lib/__init__.py define la clase Helper, en settings.py puede usar:

from . import Helper

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, ejecutándose en Windows).


Simplemente póngalos en __init__.py.

Así que con test / classes.py siendo:

class A(object): pass class B(object): pass

... y prueba / __ init__.py siendo:

from classes import * class Helper(object): pass

Puede importar pruebas y tener acceso a A, B y Helper

>>> import test >>> test.A <class ''test.classes.A''> >>> test.B <class ''test.classes.B''> >>> test.Helper <class ''test.Helper''>