Prüfen ob es Variable gibt?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Prüfen ob es Variable gibt?

Beitragvon keboo » Samstag 25. März 2006, 14:02

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Prüfen ob es Variable gibt?

Beitragvon gerold » Samstag 25. März 2006, 14:13

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Kolazomai
User
Beiträge: 33
Registriert: Donnerstag 16. Februar 2006, 15:05
Kontaktdaten:

Beitragvon Kolazomai » Samstag 25. März 2006, 14:26

Hoi,

try wär doch auch ne idee ^_^

Code: Alles auswählen

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


Mfg,

Kolazomai
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Samstag 25. März 2006, 14:28

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.
--- Heiko.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Samstag 25. März 2006, 14:40

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.
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Beitragvon keboo » Samstag 25. März 2006, 14:57

Danke für eure Antworten!

lg
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Beitragvon Hannes-Spz » Samstag 25. März 2006, 16:50

warum ist von der locals() - variante abzuraten??
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 25. März 2006, 17:21

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Samstag 25. März 2006, 17:50

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ß.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder