2011-04-29 21 views
55

Busco a qué tipo de código que haría poner en __init__.py archivos y cuáles son las mejores prácticas relacionadas con esto. O, ¿es una mala práctica en general?Por qué iba a poner el código Python en archivos __init__.py

Cualquier referencia a los documentos conocidos que explican esto también es muy apreciado.

+2

posible duplicado de (http://stackoverflow.com/questions/448271/what [¿qué es para __init__.py?] -is-init-py-for) – Aamir

Respuesta

7

Una de las mejores prácticas en esa área es importar todas las clases necesarias de su biblioteca (mirar mongoengine, por ejemplo). Así, un usuario de la biblioteca puede hacer esto:

from coollibrary import OneClass, SecondClass 

en lugar de

from coollibrary.package import OneClass 
from coollibrary.anotherpackage import SecondClass 

Además, una buena práctica es incluir en __init__.py versión constante

49

Bibliotecas y marcos suelen utilizar el código de inicialización en __init__.py archivos para ocultar cuidadosamente la estructura interna y proporcionar una interfaz uniforme para el usuario.

Tomemos el ejemplo de Django forma módulo. Varias funciones y clases en el módulo de formularios se definen en diferentes archivos según su clasificación.

forms/ 
    __init__.py 
    extras/ 
    ... 
    fields.py 
    forms.py 
    widgets.py 
    ... 

Ahora bien, si usted fuera a crear un formulario, usted tendría que saber en qué archivo cada función se define y su código para crear un formulario de contacto tendrá que ser algo como esto (lo cual es un inconveniente y feo) .

class CommentForm(forms.forms.Form): 
    name = forms.fields.CharField() 
    url = forms.fields.URLField() 
    comment = forms.fields.CharField(widget=forms.widgets.Textarea) 

En cambio, en Django que sólo puede referirse a los widgets diversos campos, formularios, etc. directamente desde el espacio de nombres de formas.

from django import forms 

class CommentForm(forms.Form): 
    name = forms.CharField() 
    url = forms.URLField() 
    comment = forms.CharField(widget=forms.Textarea) 

¿Cómo es esto posible? Para hacer esto posible, Django agrega la siguiente instrucción para forms/__init__.py archivo que importan todos los aparatos, formularios, campos etc., en el espacio de nombres forms.

from widgets import * 
from fields import * 
from forms import * 
from models import * 

Como se puede ver, esto simplifica su vida cuando se crean las formas, porque ahora usted no tiene que preocuparse en donde se define cada función/clase y sólo tiene que utilizar todos estos directamente desde forms espacio de nombres. Este es solo un ejemplo, pero puede ver ejemplos como estos en otros marcos y bibliotecas.

1
  1. Para mayor comodidad: Los demás usuarios no tendrán que conocer sus funciones exactamente ubicación.

    your_package/ 
        __init__.py 
        file1.py/ 
        file2.py/ 
        ... 
        fileN.py 
    
    # in __init__.py 
    from file1 import * 
    from file2 import * 
    ... 
    from fileN import * 
    
    # in file1.py 
    def add(): 
        pass 
    

    que otros pueden llamar a añadir() por

    from your_package import add 
    

    sin saber fichero1, como

    from your_package.file1 import add 
    
  2. algo puestos a la inicialización.Por ejemplo, el registro (esto debería poner en el nivel superior):

    import logging.config 
    logging.config.dictConfig(Your_logging_config) 
    
Cuestiones relacionadas