No tengo muy claro este aspecto. Digamos que tiene un montón de archivos .py que son sus propios módulos separados.
¿Por qué cada archivo .py necesita importar los otros cuando usan esa clase? O ellos? Porque estaba bastante seguro de que otros lenguajes (Java, por ejemplo), no requerían importación al referirme a clases / archivos en el mismo directorio. Podría estar equivocado.
Debido a que Python se interpreta, todo lo que importa está disponible en el indicador. Java (y C ++) tiene un paso de compilación y enlace que puede buscar e incluir solo funciones que se utilizan
Si todo se importara automáticamente, habría miles de funciones y variables y sería imposible escribir algo sin colisionar con una.
editar: Ok, es un poco más que simplemente compilado vs interpretado. Python pretende ser un lenguaje de "baterías incluidas": hay bibliotecas disponibles para hacer casi todo. Dado que solo usará una pequeña fracción de esos, debe haber una forma de organizarlos para que solo incluya los que necesita.
La importación desde la sintaxis es inteligente porque puede importar toda la biblioteca y mantener nombres totalmente calificados similares a Java o puede importar funciones específicas (o todas las funciones) en el espacio de nombres local
La segunda razón es especialmente importante en un lenguaje dinámico como Python. Como no tiene que definir variables antes de usarlas, sería difícil para el entorno determinar si
sin
es una función matemática o una variable suya en un intérprete.fuente
Imagina que tienes este código en python:
Obviamente, tenemos un error tipográfico y
fo
debería haberlo sidofoo
. En este momento, Python dice:Pero con una carga de clase implícita podría decir:
lo cual sería confuso Peor aún, si escribiste mal el nombre de una variable que resultó ser el nombre de un módulo, obtendrás un error aún más confuso al tratar de tratar ese módulo como si fuera tu variable. Python no puede decir si algo es un nombre de clase, objeto o lo que sea.
Java, por otro lado, creo que puede deducir de la sintaxis si cierto identificador se refiere a una clase u otra cosa. Por lo tanto, no tiene problemas para generar un mensaje de error apropiado.
En general, se ajusta a la filosofía de Python de ser explícito en lugar de implícito. Calculan que es mejor importar explícitamente un módulo en lugar de importarlo automáticamente. El problema del mensaje de error es un factor que influye en la decisión.
Algunos han sugerido que habría un gran costo de tiempo de ejecución para las importaciones implícitas. No lo creo. Lo que pasa es algo como esto:
Para soportar la carga implícita de módulos, podríamos hacer:
import foo
La primera vez que se usa el módulo, tomaría un poco más de tiempo porque primero tiene que buscar en otros diccionarios. Pero esa es solo la primera vez, y no debería ser significativa en términos de tiempo de ejecución de todo el programa.
Habría un costo significativo, en el caso de nombres de variables mal escritos. Cuando ocurren, Python perdería el tiempo leyendo el disco tratando de encontrar el módulo. Pero si eso sucede, su programa está a punto de morir con un rastreo de todos modos y el rendimiento no es una gran preocupación.
fuente
Hay algunas diferencias importantes entre Python y Java; mientras que Java tiene una regla de "una clase por archivo", Python no. Además, no todo en Python es una clase.
Por lo tanto, un módulo puede tener clases, funciones y simplemente variables antiguas, generalmente relacionadas de alguna manera (como funciones aleatorias
random
, rutinas matemáticasmath
, constantes de cadenasstring
, etc.).Si desea acceder a cualquiera de las clases / funciones / variables desde un módulo en particular, primero debe importarlo.
¿Por qué es esto algo bueno?
math.sin
y sus propiassin
funciones)fuente
Uno de los conceptos más importantes en Python es el de los espacios de nombres (
import this
en el momento oportuno para averiguar cuáles son los demás). Sé que los espacios de nombres también existen en otros idiomas, pero en Python solo tienes acceso al espacio de nombres actual, que es lo que está definido en el módulo actual. Para obtener acceso a otros identificadores, debe importarlos al espacio de nombres actual: ya sea importando su módulo contenedor (laimport foo
sintaxis) o los nombres mismos (from foo import bar
).fuente