2010-07-17 25 views
8

He escrito un paquete python que consta de varios archivos .py que contienen clases, etc. Quiero exponerlo al cliente usando el patrón "Fachada". Así que no quiero que los clientes aprendan todas las clases internas, sino solo los métodos expuestos por esta interfaz API.API de un paquete en python. En __init__.py?

Pregunta es: ¿dónde pongo esta API? ¿Defino un archivo api.py dentro del paquete o puedo poner esta API en el __init__.py del paquete?

explico mejor con un ejemplo

<my_module>\ 
    __init__.py 
    core.py 
    submodule1.py 
    submodule2.py 
    util.py 
    ........ 

así ¿Dónde pongo la API pública de?

Respuesta

10

La opción más común es usar __init__.py - vale la pena escaparse a un módulo propio (o más) solo si es lo suficientemente complejo como para garantizarlo (entonces no sería una gran fachada ;-) o, más importante aún, si proporciona API alternativas (una simplificada con funcionalidad reducida pero mayor facilidad de uso y una más rica/compleja, por ejemplo), en cuyo caso el uso de módulos separados mantiene las cosas mejor organizadas.

Comunicar a empaquetar los usuarios que están no supone que importar otros módulos directamente, asegúrese de dar nombre a "módulos de aplicación internas privadas" con un guión bajo líder: _core.py, no core.py, etc. . Esta convención siempre se usa en Python para separar las API públicas de los detalles de implementación interna y bien vale la pena el esfuerzo (realmente pequeño) para que la implemente.

+0

¿Podría tener un ejemplo de ello? Tengo una duda sobre cómo hacerlo. Por ejemplo, ¿acaba de importar __init__ la API pública para la cuestión de la exposición? – Renzo

7

El archivo __init__.py es un lugar aceptable para colocar la API pública o un paquete, con los otros módulos dentro de ella que proporcionan la implementación.

3

Hay desventajas a poner el API en __init__.py:

  • hay peligro de causar dependencias de ciclismo
  • no es un lugar obvio para buscar al navegar por una base de código

Poner la API en un módulo dedicado como api.py eleva estos problemas. Además, existen ventajas como:

  • puede ofrecer otra api después en un segundo módulo (simplificado, diferentes casos de uso, etc.)
  • proyectos Python grandes como Enthought traits.api y Trac trac.api uso de este patrón
Cuestiones relacionadas