Imagina que tienes este código en python:
foo = MyObject()
fo.bar()
Obviamente, tenemos un error tipográfico y fo
debería haberlo sido foo
. En este momento, Python dice:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'fo' is not defined
Pero con una carga de clase implícita podría decir:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named fo
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:
- Código de operación LOAD_GLOBAL invocado con el nombre "foo"
- diccionario global verificado para "foo"
- diccionario incorporado verificado para "foo"
- Si se encuentra foo, guárdelo en globals y continúe
- Si no se encuentra, aumente NameError
Para soportar la carga implícita de módulos, podríamos hacer:
- Código de operación LOAD_GLOBAL invocado con el nombre "foo"
- diccionario global verificado para "foo"
- diccionario incorporado verificado para "foo"
- Si lo anterior falla, intente
import foo
- Si se encuentra foo, guárdelo en globals y continúe
- Si no se encuentra, aumente NameError
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.