Stellen Sie sich vor, Sie hätten diesen Code in Python:
foo = MyObject()
fo.bar()
Offensichtlich haben wir einen Tippfehler und fo
hätten es tun sollen foo
. Im Moment sagt Python:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'fo' is not defined
Aber beim impliziten Laden von Klassen könnte es heißen:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named fo
das wäre verwirrend. Schlimmer noch, wenn Sie einen Variablennamen falsch geschrieben haben, der zufällig der Name eines Moduls ist, wird ein noch verwirrenderer Fehler angezeigt, wenn Sie versuchen, dieses Modul so zu behandeln, als wäre es Ihre Variable. Python kann nicht sagen, ob etwas ein Klassenname, ein Objekt oder was auch immer ist.
Java hingegen kann meiner Meinung nach anhand der Syntax erkennen, ob sich ein bestimmter Bezeichner auf eine Klasse oder etwas anderes bezieht. Somit ist es kein Problem, eine entsprechende Fehlermeldung zu erzeugen.
Insgesamt passt es in die Python-Philosophie, eher explizit als implizit zu sein. Sie finden es besser, ein Modul explizit zu importieren, als es automatisch importieren zu lassen. Das Problem der Fehlermeldung ist ein Faktor, der bei der Entscheidung eine Rolle spielt.
Einige haben vorgeschlagen, dass implizite Importe hohe Laufzeitkosten verursachen würden. Das glaube ich nicht. Was passiert, ist ungefähr so:
- LOAD_GLOBAL Opcode mit dem Namen "foo" aufgerufen
- globales Wörterbuch auf "foo" geprüft
- Eingebautes Wörterbuch auf "foo" geprüft
- Wenn foo gefunden wurde, lagern Sie es in Globals und fahren Sie fort
- Wenn foo nicht gefunden wird, lösen Sie NameError aus
Um das implizite Laden von Modulen zu unterstützen, können wir Folgendes tun:
- LOAD_GLOBAL Opcode mit dem Namen "foo" aufgerufen
- globales Wörterbuch auf "foo" geprüft
- Eingebautes Wörterbuch auf "foo" geprüft
- Wenn dies fehlschlägt, versuchen Sie es
import foo
- Wenn foo gefunden wurde, lagern Sie es in Globals und fahren Sie fort
- Wenn foo nicht gefunden wird, lösen Sie NameError aus
Bei der ersten Verwendung des Moduls dauert es etwas länger, da zuerst andere Wörterbücher durchsucht werden müssen. Dies ist jedoch nur das erste Mal und sollte für die gesamte Programmlaufzeit nicht von Bedeutung sein.
Bei falsch geschriebenen Variablennamen würden erhebliche Kosten entstehen. Wenn sie auftreten, verschwendet Python Zeit damit, die Festplatte zu lesen und zu versuchen, das Modul zu finden. Aber wenn das passiert, wird Ihr Programm sowieso mit einem Traceback sterben und die Leistung ist kein großes Problem.