Acabo de leer un artículo que supuestamente me introdujo en un nuevo concepto: Hasta ahora estaba seguro de que los paquetes de python (es decir, directorios con un archivo __init__.py
) se comportan exactamente igual que los paquetes de Java, es decir, pequeños espacios de nombres para ayudar arregle el código (menos el alcance del "paquete" de java). Pero, de acuerdo con este enlace: A Short Digression Into Multi-File Modules, si pongo todos mis archivos en el mismo "paquete":¿Los paquetes python (módulos multi-archivo) se comportan exactamente como un gran módulo?
toda la colección de archivos se presenta a otro código Python como un único módulo - como si todo el las funciones y las clases estaban en un solo .py
Así que ahora pensé que todo mi entendimiento del "paquete" python era incorrecto. Además, no es un paquete, sino un "módulo multifilar", como se lo refiere el autor.
Entonces, por lo que entendí, no importa la cantidad de archivos que divido mis funcs y clases dentro de un paquete, desde afuera ese paquete debería aparecer como si tomara todo el código de todos los archivos dentro del paquete y lo pusiera en un gran archivo con el mismo nombre del paquete, es decir, como un solo módulo.
por ejemplo, si tengo la siguiente estructura de archivos:
/base
/animals
/__init__.py
/dog.py
y en dog.py:
def bark():
print "woof"
que debería ser exactamente el mismo que tener:
/base
/animals.py
y en animals.py:
def bark():
print 'woof'
por lo tanto, esta nueva pieza de código debería funcionar bien en ambos casos:
from base import animals
animals.bark()
Este curso de los rendimientos en el primer caso:
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'module' object has no attribute 'bark'
Qué me estoy perdiendo aquí? Veo, con la excepción de que "animals", de hecho, se trata como un módulo, pero parece que todavía tengo que declarar explícitamente animals.dog.bark
, es decir, que la estructura de archivos internos del paquete no se abstrae del exterior.
¿Me falta el punto del autor, o simplemente no lo estoy implementando correctamente?
=== === EDITAR
Sólo para asegurarse de que nadie pierde esta línea en la cita:
como si todas las funciones y clases estaban en una soltero .py
independientemente de cómo acceder a la realidad esta funcs y clases, la cita anterior establece explícitamente que si usted tiene un func1 en el archivo A y func2 en el archivo B, independientemente de qué camino van a ser accesibles desde, si denote esta ruta como X, entonces, de acuerdo con la cita mencionada, tanto X.func1
como X.func2
deberían funcionar.
No he podido encontrar esa cita en la página vinculada. ¿Te importa intentarlo de nuevo? –
@Ignacio: http://diveintopython3.org/case-study-porting-chardet-to-python-3.html#multifile-modules – unutbu
@ignacio - perdon, corrigió el enlace – olamundo