Ich möchte prüfen, ob eine Variable existiert. Jetzt mache ich so etwas wie das hier:
try:
myVar
except NameError:
# Do something.
Gibt es andere Möglichkeiten ohne Ausnahmen?
Ich möchte prüfen, ob eine Variable existiert. Jetzt mache ich so etwas wie das hier:
try:
myVar
except NameError:
# Do something.
Gibt es andere Möglichkeiten ohne Ausnahmen?
Die Verwendung von Variablen, die noch nicht definiert oder gesetzt worden sind (implizit oder explizit), ist oft eine schlechte Sache in cualquier Sprache, da es darauf hindeutet, dass die Logik des Programms nicht richtig durchdacht ist und wahrscheinlich zu unvorhersehbarem Verhalten führt.
Wenn Sie brauchen um es in Python zu tun, wird der folgende Trick, der dem Ihren ähnlich ist, sicherstellen, dass eine Variable den einige Wert vor der Verwendung:
try:
myVar
except NameError:
myVar = None # or some other default value.
# Now you're free to use myVar without Python complaining.
Ich bin jedoch immer noch nicht davon überzeugt, dass das eine gute Idee ist - meiner Meinung nach sollten Sie versuchen, Ihren Code so umzugestalten, dass diese Situation nicht auftritt.
Als Beispiel wurde unten in einem Kommentar der folgende Code angegeben, um das Zeichnen einer Linie von einem früheren Punkt zum aktuellen Punkt zu ermöglichen:
if last:
draw(last, current);
last = current
In dem Fall, dass last
nicht an einen Wert gebunden ist, hilft das in Python überhaupt nicht, da auch die Überprüfung de last
löst eine Ausnahme aus. Eine bessere Idee wäre es, sicherzustellen, dass last
tut einen Wert haben, anhand dessen entschieden werden kann, ob er gültig ist oder nicht. Das wäre etwa so:
last = None
# some time passes ...
if last is not None:
draw(last, current);
last = current
Dadurch wird sichergestellt, dass die Variable existiert und dass Sie sie nur verwenden, wenn sie für den Zweck, für den Sie sie benötigen, gültig ist. Das ist es, was ich annehme, dass die if last
war bedeutete im Kommentarcode zu tun (aber nicht), und Sie können den Code immer noch hinzufügen zu Kraft wenn Sie keine Kontrolle über die anfängliche Einstellung der Variablen haben, indem Sie die obige Ausnahmemethode verwenden:
# Variable 'last' may or may not be bound to a value at this point.
try:
last
except NameError:
last = None
# It will always now be bound to a value at this point.
if last is not None:
draw(last, current);
last = current
Die Verwendung von try/except ist der beste Weg, um das Vorhandensein einer Variablen zu testen. Aber es gibt mit Sicherheit einen besseren Weg, das zu tun, was Sie tun, als globale Variablen zu setzen/zu testen.
Wenn Sie zum Beispiel eine Variable auf Modulebene beim ersten Aufruf einer Funktion initialisieren wollen, ist es besser, wenn Sie einen Code wie den folgenden verwenden:
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
Ich gehe davon aus, dass der Test in einer Funktion verwendet werden soll, ähnlich wie bei user97370's Antwort . Ich mag diese Antwort nicht, weil sie den globalen Namensraum verschmutzt. Eine Möglichkeit, dies zu beheben, ist, stattdessen eine Klasse zu verwenden:
class InitMyVariable(object):
my_variable = None
def __call__(self):
if self.my_variable is None:
self.my_variable = ...
Ich mag das nicht, weil es den Code verkompliziert und Fragen aufwirft, wie z. B.: Sollte dies das Singleton-Programmiermuster bestätigen? Glücklicherweise erlaubt Python schon seit einiger Zeit, dass Funktionen Attribute haben, was uns diese einfache Lösung ermöglicht:
def InitMyVariable():
if InitMyVariable.my_variable is None:
InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.