Imagine que você tinha esse código em python:
foo = MyObject()
fo.bar()
Obviamente, temos um erro de digitação e fo
deveria ter sido foo
. No momento, o python diz:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'fo' is not defined
Mas com o carregamento implícito de classe, pode-se dizer:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named fo
o que seria confuso. Pior ainda, se você digitasse incorretamente um nome de variável que por acaso era o nome de um módulo, você receberia um erro ainda mais confuso ao tentar tratar esse módulo como se fosse sua variável. Python não pode dizer se algo é um nome de classe, objeto ou qualquer outra coisa.
Java, por outro lado, acredito que pode distinguir da sintaxe se um determinado identificador se refere a uma classe ou outra coisa. Portanto, não há problema em produzir uma mensagem de erro apropriada.
No geral, ele se encaixa na filosofia Python de ser explícito e não implícito. Eles acham melhor importar explicitamente um módulo, em vez de importá-lo automaticamente. O problema da mensagem de erro é um fator que influencia a decisão.
Alguns sugeriram que haveria um grande custo de tempo de execução para importações implícitas. Acho que não. O que acontece é algo como isto:
- Código de operação LOAD_GLOBAL chamado com o nome "foo"
- dicionário global verificado para "foo"
- dicionário embutido verificado para "foo"
- Se for encontrado, armazene em globais e continue
- Se foo não encontrado, aumente NameError
Para suportar o carregamento implícito do módulo, poderíamos fazer:
- Código de operação LOAD_GLOBAL chamado com o nome "foo"
- dicionário global verificado para "foo"
- dicionário embutido verificado para "foo"
- Se o acima falhar, tente
import foo
- Se for encontrado, armazene em globais e continue
- Se foo não encontrado, aumente NameError
Na primeira vez em que o módulo é usado, levaria um pouco mais de tempo, pois ele deve procurar outros dicionários primeiro. Mas essa é apenas a primeira vez e não deve ser significativa em termos de tempo de execução do programa.
Haveria um custo significativo, no caso de nomes de variáveis com erros ortográficos. Quando ocorrem, o python perde tempo lendo o disco tentando encontrar o módulo. Mas se isso acontecer, seu programa está prestes a morrer com um retorno, e o desempenho não é uma grande preocupação.