if option == 'hilfe' führt zu NameError: name 'hilfe' is not

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.
Antworten
ltownatze
User
Beiträge: 28
Registriert: Donnerstag 8. April 2010, 16:02

Donnerstag 8. April 2010, 16:37

Hi,

Ich versteh beim besten willen nicht wieso das nicht funktioniert..

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

option = 'default'
print option

while option != 'exit':
    option = input('backItUp $: ')

    if option == 'hilfe':
        print 'option =', option
    elif option == 'show':
        print 'option =', option
    elif option == 'create':
        print 'option =', option
    elif option == 'delete':
        print 'option =', option

else:
    print 'Exiting...'

Code: Alles auswählen

$ ./backItUp.py 
default
backItUp $: hilfe
Traceback (most recent call last):
  File "./backItUp.py", line 8, in <module>
    option = input('backItUp $: ')
  File "<string>", line 1, in <module>
NameError: name 'hilfe' is not defined

$ ./backItUp.py 
default
backItUp $: 'hilfe'
option = hilfe
backItUp $:
Wie schaff ich es, dass es auch ohne die '' funktionert?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Donnerstag 8. April 2010, 16:41

Verwende raw_input statt input! Und zwar immer, solange du nicht Python3 verwendest!
ltownatze
User
Beiträge: 28
Registriert: Donnerstag 8. April 2010, 16:02

Donnerstag 8. April 2010, 16:53

Danke für die schnelle Antwort.

Problem gelöst!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 9. April 2010, 17:23

Außerdem könnte man vermutlich die ganzen if-else-Kaskaden durch ein Dictionary ersetzen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Samstag 10. April 2010, 14:41

Oder das optparse-Modul verwenden - ist für Anfänger vielleicht reichlich komplex, aber sehr mächtig und flexibel.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Samstag 10. April 2010, 14:45

Bei der Schleife sucht der TE wohl eher das cmd-Modul.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Samstag 10. April 2010, 15:44

In der Tat - war wohl gerade nicht richtig wach ... :oops:
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Samstag 10. April 2010, 16:15

Noch ein Hinweis: while-else (und auch for-else) funktioniert in Python nicht so wie du denkst: http://docs.python.org/tutorial/control ... s-on-loops
ltownatze
User
Beiträge: 28
Registriert: Donnerstag 8. April 2010, 16:02

Samstag 10. April 2010, 18:31

Danke für die wirklich hilfreichen Hinweise.

cmd scheint wirklich genau das zu sein was ich suche und auch optparse wird mir wohl sehr entgegen kommen.

Wirklich ein gutes Forum hier.
Noch ein Hinweis: while-else (und auch for-else) funktioniert in Python nicht so wie du denkst
Wie meinst du das? Und woran siehst du das?

Etwas OT aber ein neues Thema würd wohl nich lohnen:

Gibt es eine deutsche Übersetzung der Python Standard Library?
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Samstag 10. April 2010, 18:45

Ich glaub derdon hat da was verwechselt, denn eigentlich arbeitet while-else so.
In dem von ihm verlinkten Beispiel wird break verwendet und daher wird dort der else-Zweig nur erreicht, wenn die Schleife vorher erfolglos durchgelaufen ist. Vielleicht hat er das mit der normalen Funktionsweise verwechselt, keine Ahnung :)
BlackJack

Samstag 10. April 2010, 20:05

@Nocta: Sicher das Du da nichts verwechselst? In dem Beispiel wird ``break`` verwendet -- und *nur dann* macht ein ``else`` überhaupt Sinn. Wenn kein ``break`` in der Schleife steht, dann wird der ``else``-Zweig *immer* ausgeführt. In dem Fall kann man den Code aber auch einfach hinter die Schleife schreiben und muss den Leser nicht mit einem sinnfreien ``else``-Zweig verwirren.
ltownatze
User
Beiträge: 28
Registriert: Donnerstag 8. April 2010, 16:02

Samstag 10. April 2010, 21:22

Wenn kein ``break`` in der Schleife steht, dann wird der ``else``-Zweig *immer* ausgeführt.
Wenn das so ist, müsste dann nicht bei jedem durchlauf der while-Schleife, zusätzlich zur eingetreten if-Abfrage, 'Exiting...' ausgegeben werden?

Oder versteh ich da irgendwas falsch?
BlackJack

Samstag 10. April 2010, 21:44

@ltownatze: Er wird immer nach der Schleife ausgeführt. Das wird Code der einfach hinter der Schleife steht aber auch.
ltownatze
User
Beiträge: 28
Registriert: Donnerstag 8. April 2010, 16:02

Samstag 10. April 2010, 22:04

Jetzt hab ichs verstanden, danke :!:
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Sonntag 11. April 2010, 14:57

@Blackjack: Ich hab da nichts verwechselt, der Code funktioniert ja so, wie der Threadersteller es wollte :)
Dass das else so keinen Sinn macht, ist aber auch wieder wahr.
Na ja, ist ja jetzt auch geklärt.
Antworten