[pyar] Importación de módulos

Juan Pablo Scaletti juanpablo en jpscaletti.com
Vie Feb 27 11:24:11 ART 2015


> On Feb 26, 2015, at 6:41 PM, Leandro E. Colombo Viña <colomboleandro en gmail.com> wrote:
> Estimados!
> 
> Vengo a consultarles cómo me sugieren o cómo es la mejor manera de hacer esta importación...
> 
> Estamos trabajando en una aplicación y pensamos la siguiente estructura:
> 
> app/
>     run.py
>     controlador/
>         __init__.py
>         controlador.py
>     db/
>         __init__.py
>         db.py
>     monitor/
>         __init__.py
>         monitor.py
> 
> La idea es la siguiente: la app se corre desde run.py, es una aplicación web en Flask que consulta una base de datos y controla unos dispositivos electrónicos. En monitor está toda la parte web y lo que sería la interfaz de usuario. En db está la configuración de la base de datos (ahí se importa el conector y está la clase que maneja la conexión) que usaría tanto el monitor como el controlador. Y en controlador está todo lo necesario para comunicarse con la electrónica.
> 
> El tema es que queremos ver cuál es la mejor manera de realizar la importación de los parámetros de configuración de la base de datos para ambos paquetes (monitor y controlador). 
> Recomiendan usar importaciones relativas? O cargar en el sys.path los directorios donde estan los paquetes e importarlos así?
> 
> Si recomiendan otra estructura de directorios, escuchamos ofertas...
> La idea es tener un único módulo con todo lo de la db, y que pueda ser llamado por el controlador y el monitor. Además necesitamos la funcionalidad de que el monitor pueda llamar (y ejecutar) al controlador.
> 
> Abrazo!
> 
Hola!

A mi me parece que usar imports relativos es mucho más limpio y claro que agregar cada folder a tu PYTHON_PATH
Pero con tu estructura actual no funcionará, por que si desde `controlador.py` intentas hacer algo como:

    from ..monitor import monitor

se va a quejar de: `ValueError: Attempted relative import beyond toplevel package`

Necesitas un folder intermedio, de esta manera:

app/
    run.py
    webapp/
        __init__.py
        controlador/
            __init__.py
            controlador.py
        db/
            __init__.py
            db.py
        monitor/
            __init__.py
            monitor.py

Sobre la configuración, lo que yo hago es tener un folder `config` con archivos separados para cada entorno

webapp/
    config/
        __init__.py
        common.py
        development.py
        production.py

El `common.py` tiene la configuración común (o base) para todos los entornos. Los demás hacen

    from .common import *

al principio y sobreescriben o agregan cualquier configuración específica.
El truco está en el archivo `__init__.py`

En que entorno estás puedes leerlo desde... una variable de entorno:

    # coding=utf-8
    import os

    APP_ENV = 'AWESOMEAPP_ENV'

    if os.environ[APP_ENV] == 'production':
        from .production import *
    else:
        from .development import *

    # Import local settings
    try:
        from .local import *
    except ImportError:
        pass

Yo además le agrego un archivo `local.py` que **no** se supe al control de versiones, donde cada desarrollador puede poner su configuración específica para su computadora (user/passw de su BD local por ejemplo).

Sobre la estructura más plana, pues depende de que tan grande sea tu proyecto. 
A mi me gusta tener cada modelo y cada vista en un archivo separado (para encontrarlas rápidamente), así que esas carpeta se llenan rápidamente.

Otros consejos sueltos:

- Piense en usar algo como Baker (https://bitbucket.org/mchaput/baker/wiki/Home) para tu run.py. optparse IMHO es más complejo de lo que debería.
- Y dode están los requirements.txt ? Necesitas uno para cada entorno ¿no?
- Es una aplicación web? Authcode [by me ;)] (http://authcode.lucuma.co/) para la autenticación 

Suerte!


— Juan Pablo
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20150227/13b0f455/attachment.html>


More information about the pyar mailing list