Seite 1 von 1

Prüfen ob es Variable gibt?

Verfasst: Samstag 25. März 2006, 14:02
von keboo
Hallo Leute!

Ich kenne von php den isset Befehl, der schaut ob eine Variable gesetzt beziehungsweise definiert ist.

Gibt es was ähnliches auch in Python?

Code: Alles auswählen

if var:
   print 'hallo'
else:
   print 'geht nicht'
var ist nicht definiert in dem Fall. Deshalb würde ich die Ausgabe 'geht nicht' wünschen.

LG
Johannes

Re: Prüfen ob es Variable gibt?

Verfasst: Samstag 25. März 2006, 14:13
von gerold
keboo hat geschrieben:

Code: Alles auswählen

if var:
   print 'hallo'
else:
   print 'geht nicht'
Hi Johannes!

Geh doch auf Nummer Sicher und befülle die Variable auf jeden Fall:

Code: Alles auswählen

var = None
# --> hier könnte die Variable verändert werden
if not var is None:
    print "Hallo"
else:
    print "Nix"
mfg
Gerold
:-)

Verfasst: Samstag 25. März 2006, 14:26
von Kolazomai
Hoi,

try wär doch auch ne idee ^_^

Code: Alles auswählen

try:
     print var
except:
     print "Var does not exist"
Mfg,

Kolazomai

Verfasst: Samstag 25. März 2006, 14:28
von modelnine
Noch besser ist:

Code: Alles auswählen

var = None
# --> hier könnte die Variable verändert werden
if var is not None:
    print "Hallo"
else:
    print "Nix"
Das hat einige Vorteile was die Präzedenz von Operatoren angeht. Ist sonst aber identisch mit dem letzten.

Unabhängig davon: in Python gibts nichts (einfaches) was prüft ob in einem Namespace eine Variable definiert ist. Sprich: man macht es nicht, sondern wenn man eine Variable braucht und nicht weiß ob sie gesetzt wurde gibt man der Variable einen "Standardwert," genau wie Gerold das auch schon beschrieben hat.

Verfasst: Samstag 25. März 2006, 14:40
von Joghurt
Wie Kolazomai schon geschrieben hat, wäre der pythonische Weg (wenn wir davon absehen, dass es unpythonisch ist, variablen nicht zu initialisieren)

Code: Alles auswählen

try:
  # irgendwas mit var machen
except NameError:
  # var ist nicht gesetzt, irgendwie behandeln
Ansonsten kann man auch mit

Code: Alles auswählen

 if 'var' in locals()
auf Existenz im lokalen (globals für globalen) Namensraum prüfen. Davon ist aber abzuraten.

Verfasst: Samstag 25. März 2006, 14:57
von keboo
Danke für eure Antworten!

lg

Verfasst: Samstag 25. März 2006, 16:50
von Hannes-Spz
warum ist von der locals() - variante abzuraten??

Verfasst: Samstag 25. März 2006, 17:21
von gerold
Hannes-Spz hat geschrieben:warum ist von der locals() - variante abzuraten??
Hi Hannes-Spz!

locals() ist eine Funktion die erst einmal aufgerufen werden muss und ein Dictionary zurück gibt. Mit globals() verhält es sich gleich, nur mit dem Unterschied, dass das Dictionary je nach Programm viel größer werden kann.

Prüfst du **nur** den Wert einer Variable, dann fällt der komplette Overhead, des Erzeugens eines neuen Dictionaries und des Suchens im Dictionary weg. Den Wert der Variable kann Python intern viel schneller herausfinden. Da kommt weder ein selbstgestricktes "Nachsehen ob Vorhanden", noch ein Abfangen eines Fehlers ran. Dein Programm wird also schneller, wenn du den Wert und nicht die Existenz prüfst.

Du vermeidest Fehler, wenn du vorher deine Variablen sauber zuweist. Würdest du dich bei ``if 'var' in locals()`` verschreiben, dann gibt es keinen Fehler. Verschreibst du dich aber bei ``if var is not None``, dann warnt dich Python, wenn es die Variable nicht schon gibt.

Es ist eine andere Art zu programmieren. Eine, aus meiner Sicht, saubere Art zu programmieren. Der Vorteil von Python --> es schränkt dich nicht ein. Beide Möglichkeiten sind OK und du wirst von niemandem gesteinigt. :D

mfg
Gerold
:-)

Verfasst: Samstag 25. März 2006, 17:50
von Joghurt
Dieses angeblich tolle "unbekannte Variablen sind leer" Feature von PHP ist sehr nervig.
Betrachte dieses Beispiel

Code: Alles auswählen

<?php
  $Anzahl = 10;
  for &#40;$i = 0; $i<$Anzhal; $i++&#41; &#123;
      tu_irgendwas&#40;$i&#41;;
  &#125;
?>
Ich hab schonmal eine halbe Stunde damit verbracht, herauszufinden, warum der Code nicht richtig läuft. (Sprich, warum tu_irgendwas nicht aufgerufen wird)

Oder, noch fieser (wenngleich das jetzt auch etwas bei den Haaren herbeigezogen ist, aber das Problem sollte klar sein)

Code: Alles auswählen

 <?php
 function delete_from&#40;$start, $end&#41; &#123;
      for&#40;$i=$strat; $i<=$end; $i++&#41; &#123;
          echo "Lösche Eintrag #".$i."\n";
      &#125;
  &#125;

  delete_from&#40;80,100&#41;; # 0-80 sind wichtige Daten, und jetzt 
                   # "seltsamerweise" weg
?>
Ich bin echt froh, dass es jetzt Zope, TurboGears, Ruby on Rails etc. gibt. Da macht das Webapplikationsprogrammieren wieder Spaß.