todas qué programacion paquetes módulos modulos lista librerias las importar implementa crear cliente clases python module package multifile

programacion - qué módulos de python implementa un cliente soa



¿Los paquetes de Python(módulos de múltiples archivos) se comportan exactamente como un gran módulo? (4)

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: Una breve digresión en módulos de múltiples archivos , si pongo todos mis archivos en el mismo "paquete":

toda la colección de archivos se presenta a otros códigos de Python como un único módulo, como si todas las funciones y clases estuvieran en un único .py

Así que ahora pensé que todo lo que entendía sobre el "paquete" python estaba mal. Además, no es un paquete, sino un "módulo multifilar", como se lo refiere el autor.

Entonces, por lo que entendí, no importa cuántos archivos divida 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 que el paquete en su lugar, es decir, como un módulo.

por ejemplo, si tengo la siguiente estructura de archivo:

/base /animals /__init__.py /dog.py

y en dog.py:

def bark(): print "woof"

debería ser exactamente lo mismo que tener:

/base /animals.py

y en animals.py:

def bark(): print ''woof''

por lo tanto, esta próxima pieza de código debería funcionar bien en ambos casos:

from base import animals animals.bark()

Esto, por supuesto, cede en el primer caso:

Traceback (most recent call last): File "<console>", line 1, in <module> AttributeError: ''module'' object has no attribute ''bark''

¿Que me estoy perdiendo aqui? Veo, con la excepción de que "animals", de hecho, se trata como un módulo, pero parece que todavía tengo que indicar explícitamente animals.dog.bark , es decir, la estructura de archivos internos del paquete no se abstrae del exterior.

¿Me estoy perdiendo el punto del autor o simplemente no lo estoy implementando correctamente?

=== EDITAR ===

Solo para asegurarse de que nadie omita esta línea en la cita:

como si todas las funciones y clases estuvieran en un solo .py

Independientemente de cómo acceder realmente a estos funcs y clases, la cita anterior establece explícitamente que si tiene un func1 en el archivo a y func2 en el archivo b, independientemente de qué ruta serán accesibles, si denotamos esta ruta como X entonces, de acuerdo con la cita anterior, tanto X.func1 como X.func2 deberían funcionar.


El autor ha simplificado demasiado las cosas. Él está diciendo que todo lo que está debajo de los animal puede verse en el mismo módulo, aunque el hecho es que los nombres en animal.dog estarán en su propio espacio de nombres.


No es una respuesta real, pero como aún no puedo comentar (suspiro):

Dado que diveintopython es un recurso muy utilizado / citado / referenciado para los programadores de Python (al menos cuando comienzan), debes contactar al autor acerca de este error, ya que también será engañoso para otros. Hay alguna información de contacto en la página de inicio de diveintopython3 y también puede presentarla como un problema en github.


Realmente no puedo explicarlo bien, pero tal vez el siguiente código ayude. Si dejo tu primera estructura de archivos tal como está, y en su lugar la modifico para tener lo siguiente en el archivo animals.py:

class Dog: def bark(self): pass dog=Dog()

Entonces en ambos casos,

from base import animals animals.dog.bark()

trabajará.


Tal vez el punto es simplemente que un paquete es solo un tipo específico de módulo.

/base /animals /__init__.py /dog.py

Simplemente significa que cualquier cosa que defina o importe en __init__.py será visible dentro del módulo de animals .

Entonces, los animals son un módulo (que es un paquete) y animals.dog es un módulo que es un submódulo de animals , pero no un paquete.

También significa que si tiene un módulo de animals simple, puede sustituirlo por un paquete con el mismo nombre en la próxima versión, y organizarlo para que los usuarios no noten la diferencia.

Si desea que todas las clases de los submódulos del paquete constituyan un único módulo visible para el usuario (espacio de nombres), debe definir una línea como esta para cada submódulo, en __init__.py :

from animals.dog import *