Seite 1 von 1

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

Verfasst: Donnerstag 8. April 2010, 16:37
von ltownatze
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?

Verfasst: Donnerstag 8. April 2010, 16:41
von derdon
Verwende raw_input statt input! Und zwar immer, solange du nicht Python3 verwendest!

Verfasst: Donnerstag 8. April 2010, 16:53
von ltownatze
Danke für die schnelle Antwort.

Problem gelöst!

Verfasst: Freitag 9. April 2010, 17:23
von Hyperion
Außerdem könnte man vermutlich die ganzen if-else-Kaskaden durch ein Dictionary ersetzen.

Verfasst: Samstag 10. April 2010, 14:41
von CM
Oder das optparse-Modul verwenden - ist für Anfänger vielleicht reichlich komplex, aber sehr mächtig und flexibel.

Verfasst: Samstag 10. April 2010, 14:45
von derdon
Bei der Schleife sucht der TE wohl eher das cmd-Modul.

Verfasst: Samstag 10. April 2010, 15:44
von CM
In der Tat - war wohl gerade nicht richtig wach ... :oops:

Verfasst: Samstag 10. April 2010, 16:15
von derdon
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

Verfasst: Samstag 10. April 2010, 18:31
von ltownatze
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?

Verfasst: Samstag 10. April 2010, 18:45
von Nocta
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 :)

Verfasst: Samstag 10. April 2010, 20:05
von BlackJack
@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.

Verfasst: Samstag 10. April 2010, 21:22
von ltownatze
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?

Verfasst: Samstag 10. April 2010, 21:44
von BlackJack
@ltownatze: Er wird immer nach der Schleife ausgeführt. Das wird Code der einfach hinter der Schleife steht aber auch.

Verfasst: Samstag 10. April 2010, 22:04
von ltownatze
Jetzt hab ichs verstanden, danke :!:

Verfasst: Sonntag 11. April 2010, 14:57
von Nocta
@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.