Wenn durch defined
Sie meinen, ever assigned any value whatsoever to in any scope accessible from here
, dann wird der Versuch, auf eine "undefined" Variable zuzugreifen, eine NameError Ausnahme auslösen (oder eine Unterklasse davon, aber fangen NameError wird auch die Unterklasse fangen).So ist die einfachste Art und Weise durchzuführen, buchstäblich, die absolut seltsame Aufgabe, die Sie fragen, ist:
for varname in ('a', 'b', 'c'):
try: return eval(varname)
except NameError: pass
return default
Jede fehlt angebliche Lösung eine try/except nicht für „definiert“ unter der obigen Bedeutung arbeiten. Ansätze, die auf der Erkundung bestimmter Bereiche basieren, werden entweder andere Bereiche vermissen oder ziemlich komplex sein, wenn Sie versuchen, die für Sie so einfache Bereichsanordnungslogik zu replizieren, die eval
für Sie ist.
Mit "definiert" meinen Sie eigentlich "zugewiesen einen Wert, der wahr (im Gegensatz zu false) auswertet", dh alle Werte sind tatsächlich definiert (aber möglicherweise falsch sein, und Sie wollen die erste true value), dann wird der bereits vorgeschlagene a or b or c or default
zum einfachsten Ansatz. Aber das ist eine völlig andere (und noch seltsamer!) Bedeutung für das Wort "definiert"! -)
ich weiß nicht über "Pythonic", aber ich mag die erste. schön und lispy und einfach zu lesen :) – mtvee
Wie meinst du "definiert"? Wenn b zum Beispiel nicht definiert ist, erhalten Sie einen NameError. Ihr Code prüft, ob die Variablen definiert sind, aber leer/Null/Falsch. –
Beachten Sie, dass Sie in Python keine Variablen definieren, sondern Namen an Objekte binden. –