2010-03-02 14 views
60

Tengo dificultades para entender los escenarios de uso o los objetivos de diseño de los archivos __init__.py de python en mis proyectos.usando __init__.py

Supongamos que tengo directorio 'modelo' (se refiere como un paquete) que contiene los siguientes archivos

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py

He encontrado dos formas de utilizar __init__.py:

  1. Tengo una definición común que debe ser usado en solrmodel.py, mongomodel.py, samodel.py. ¿Puedo usar __init__.py como una definición básica/común para todas las * clases model.py? Esto significa que tengo que importar model/__init__.py.

  2. O bien, el __init__.py se han importado las definiciones de solrmodel.py, mongomodel.py, samodel.py en su propia y permite la fácil importación de clases o función como esta:

    # file: __init__.py 
    
    from mongomodel import * 
    from solrmodel import * 
    from samodel import * 
    

    (I soy consciente de que import * no es recomendable y yo sólo lo utilizaron como una convención)

no podía decidir entre dos escenarios más arriba. ¿Hay más escenarios de uso para __init__.py y puede explicar el uso?

+1

Parece que stackoverflow tiene un problema en el rebajado de la representación. durante la edición, muestra \ __ init__.py pero mientras se muestra muestra _init_.py. ¿Alguien puede arreglar la convención \ __ init__.py? –

+11

Utilice los trazos atrás para ponerlo en un bloque de código, como este: '\' __init __. Py \ ''. o use \ like '\\ _ \\ _ init \\ _ \\ _. py' para \ _ \ _ init \ _ \ _. py. Los subrayados se utilizan para poner en cursiva. – Ponkadoodle

Respuesta

47

La gran mayoría de los archivos __init__.py que escribo están vacíos, porque muchos paquetes no tienen nada que inicializar.

Un ejemplo en el que puedo desear la inicialización es cuando en el tiempo de carga del paquete quiero leer en una serie de datos de una vez por todas (desde archivos, un DB o la web, por ejemplo), en cuyo caso es mucho mejor poner esa lectura en una función privada en el paquete __init__.py en lugar de tener un "módulo de inicialización" separado e importar de manera redundante ese módulo de cada módulo real en el paquete (inútilmente repetitivo y propenso a errores: eso es obviamente un caso en el que confiar en la garantía del idioma de que el paquete __init__.pyes cargado una vez antes de que cualquier módulo en el paquete sea obviamente mucho más ¡Ptónico!).

Para otras expresiones de opinión concretas y autorizadas, observe los diferentes enfoques adoptados en los diversos paquetes que forman parte de la biblioteca estándar de Python.

+2

Pylons recomienda poner los modelos dentro de __init__.py. ¿Está bien? realmente inicializar el modelo de esa manera? –

+8

Personalmente, prefiero no poner código sustancial en '__init __. py', pero no hay una razón profunda para evitarlo, es puramente una elección de estilo. Todo el código en ese archivo se ejecuta la primera vez que importa el paquete o cualquier módulo del paquete. –

+0

Tengo una pregunta sobre las variables globales en las vistas de Django. ¿Puede dar su opinión por favor? http://stackoverflow.com/questions/39490843/django-app-level- variables –

22

Los contenidos de __init__.py se importan cuando importa un módulo dentro del paquete.

Está pasando por alto un tercer escenario, que consiste en colocar las partes comunes en un módulo separado y luego importar los otros módulos, dejando __init__.py para las cosas que se utilizarán fuera del paquete. Esta es la práctica que suelo seguir.

+1

No entiendo del todo. ¿Podría darnos un ejemplo para el tercer escenario? –

+3

@Tyler Long, quiere decir tener un módulo de inicialización separado (fe 'bootstrap' y llamar' import bootstrap' en el paquete '__init __. Py'. – warvariuc

Cuestiones relacionadas