Distribución de un solo archivo de Python: ¿módulo o paquete?

24

Supongamos que tengo una función o clase de python útil (o lo useful_thingque sea) llamada que existe en un solo archivo. Esencialmente hay dos formas de organizar el árbol de origen. La primera forma usa un solo módulo:

- setup.py
- README.rst
- ...etc...
- foo.py

donde useful_thingse define en foo.py. La segunda estrategia es hacer un paquete:

- setup.py
- README.rst
- ...etc...
- foo
|-module.py
|-__init__.py

donde useful_thingse define en module.py. En el caso del paquete __init__.pyse vería así

from foo.module import useful_thing

para que en ambos casos puedas hacer from foo import useful_thing.

Pregunta: ¿Qué camino se prefiere y por qué?

EDITAR: Dado que el usuario gnat dice que esta pregunta está mal formada, agregaré que el tutorial oficial de empaquetado de Python no parece comentar cuál de los métodos descritos anteriormente es el preferido. Yo estoy explícitamente no dando mi lista personal de pros y contras porque estoy interesado en saber si existe un método preferido de la comunidad, no generar una discusión de ventajas / desventajas :)

DanielSank
fuente
Compartir su investigación ayuda a todos . Cuéntanos qué has probado y por qué no satisfizo tus necesidades. Esto demuestra que te has tomado el tiempo para tratar de ayudarte a ti mismo, nos salva de reiterar respuestas obvias y, sobre todo, te ayuda a obtener una respuesta más específica y relevante. También vea Cómo preguntar
mosquito
1
@gnat: Gracias por el enlace a cómo preguntar. Soy consciente de una buena práctica para hacer preguntas, pero en este caso no pensé que fuera apropiado dar mi experiencia porque eso probablemente convertiría lo que he preguntado como una pregunta clara "A o B" en una solicitud de opiniones. ¿Cómo recomendaría mejorar esta pregunta sin que se base en una opinión?
DanielSank
@gnat: En otras palabras, si estuviera interesado en una lista de pros / contras para los dos métodos, habría preguntado "¿Cuáles son las ventajas y desventajas de estos dos métodos" y habría incluido mi propia lista parcial.
DanielSank

Respuestas:

17

Haces lo más simple que te funciona .

Para un módulo de una función , no tiene absolutamente ningún sentido crear un paquete. Los paquetes son útiles para crear un espacio de nombres adicional y / o para organizar su código en múltiples módulos.

Los módulos jsony unittesten la biblioteca estándar de Python son realmente paquetes, por ejemplo, para fines de organización de código. Pero está perfectamente bien dejar el código actualmente viviendo en un solo archivo de Python, como un solo módulo.

Si quieres ejemplos:

Para ver un buen ejemplo de proyectos que realmente hacen un uso excelente de los paquetes, consulte:

No hay una recomendación "oficial"; Ambas opciones son completamente válidas.

Martijn Pieters
fuente
Entonces, ¿no hay un método oficialmente preferido?
DanielSank
3
No, no hay un método preferido.
Martijn Pieters