Immagina di avere questo codice in python:
foo = MyObject()
fo.bar()
Ovviamente, abbiamo un errore di battitura e fo
avrebbe dovuto essere foo
. In questo momento python dice:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'fo' is not defined
Ma con il caricamento di classe implicito potrebbe dire:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named fo
che sarebbe fonte di confusione. Peggio ancora, se hai sbagliato a digitare un nome di variabile che era il nome di un modulo, potresti ottenere un errore ancora più confuso mentre tentavi di trattare quel modulo come se fosse la tua variabile. Python non può sapere se qualcosa è un nome di classe, oggetto o altro.
Java, d'altra parte, credo possa dire dalla sintassi se un certo identificatore si riferisce a una classe o qualcos'altro. Pertanto non ha alcun problema con la produzione di un messaggio di errore appropriato.
Nel complesso, rientra nella filosofia di Python di essere espliciti piuttosto che impliciti. Pensano che sia meglio importare esplicitamente un modulo piuttosto che importarlo automaticamente. Il problema del messaggio di errore è un fattore che gioca nella decisione.
Alcuni hanno suggerito che ci sarebbe un grande costo di runtime per le importazioni implicite. Io non la penso così Quello che succede è qualcosa del genere:
- LOAD_GLOBAL opcode richiamato con nome "foo"
- dizionario globale controllato per "pippo"
-
builtins dizionario controllato per "foo"
- Se viene trovato, memorizza in globals e continua su
- Se non viene trovato, sollevare NameError
Per supportare il caricamento implicito del modulo, potremmo fare:
- LOAD_GLOBAL opcode richiamato con nome "foo"
- dizionario globale controllato per "pippo"
-
builtins dizionario controllato per "foo"
- se il precedente non funziona, prova
import foo
- Se viene trovato, memorizza in globals e continua su
- Se non viene trovato, sollevare NameError
La prima volta che il modulo viene utilizzato, ci vorrebbe un po 'di più perché deve prima cercare attraverso altri dizionari. Ma questa è solo la prima volta e non dovrebbe essere significativa in termini di intero runtime del programma.
Ci sarebbe un costo significativo, nel caso di nomi di variabili con errori di ortografia. Quando si imbattono, Python perderebbe tempo a leggere il disco cercando di trovare il modulo. Ma se ciò accade il tuo programma sta per morire comunque con un traceback e la performance non è un grosso problema.