Seite 1 von 1
Wert in Konsole vorgeben
Verfasst: Dienstag 29. Januar 2008, 07:41
von mathi
HI,
ich möchte eine Eingabe folgendermaßen gestalten:
Code: Alles auswählen
c=wert1 # c soll std.mäßig wert1 besitzen
c=raw_input('bitte Wert eingeben: ')
wobei dann in der konsole folgendes gezeigt werden soll:
Code: Alles auswählen
>>> c=raw_input('bitte Wert eingeben: ')
bitte Wert eingeben: wert1
ich möchte also einen Standardwert als default schon mitgeben, der Benutzer bestätigt mit enter, oder ändert den Wert, wenn er einen anderen eingeben möchte. Wie kann ich das geschickt realisieren?
Verfasst: Dienstag 29. Januar 2008, 08:07
von Zap
Wenns in einer Zeile passieren soll kann das so gehen:
Code: Alles auswählen
In [1]: default = 10
In [2]: c = int((True and raw_input("bitte Wert eingeben(%i):" % default) or default))
bitte Wert eingeben(10):
In [3]: c
Out[3]: 10
Obs built-in ne Abwandlung von raw_input gibt bei der du einen Defaultwert vorgeben kannst, weiß ich nicht.
Verfasst: Dienstag 29. Januar 2008, 08:13
von bwbg
Oder man bastelt sich (Quick&Dirty) eine Funktion für solche Aufgaben:
Code: Alles auswählen
def ask(prompt, typ, default):
print ('%s [%s] ' % (prompt, default)),
value = typ(raw_input())
if not value:
return default
else:
return value
Code: Alles auswählen
>>> print ask('Bitte geben Sie einen String ein', str, 'Hallo Welt!')
Bitte geben Sie einen String ein [Hallo Welt!]
Hallo Welt!
>>> print ask('Bitte geben Sie einen String ein', str, 'Hallo Welt!')
Bitte geben Sie einen String ein [Hallo Welt!] Blubb
Blubb
Grüße... Heiko
Verfasst: Dienstag 29. Januar 2008, 09:37
von mathi
vielen Dank an alle, jetzt hab ich was geschrieben:
Code: Alles auswählen
#def ask(prompt, typ, default):
# print ('%s [%s] ' % (prompt, default)),
# value = typ(raw_input())
# if not value:
# return default
# else:
# return value
def float_input(prompt,default):
while True:
try:
eingabewert=float(raw_input(prompt))
vorgabe=float(default)
if not eingabewert:
return vorgabe
else:
return eingabewert
except ValueError:
print "Na das ist aber keine Zahl!"
radius = float_input('Bitte den Radius eingeben: ',5)
hoehe = float_input('Und die Hoehe: ',23)
print radius
print hoehe
aber das beißt sich: wenn ich keine Eingabe mache ist das leider ein ValueError, dieser soll dann aber nur bei "nicht Zahlen" also Buchstabeneingaben anschlagen
am Rande:
Ist es möglich den default-Wert durch die Eingabe abzuändern?
also default=35
bei der Abfrage nach dem Wert erscheint schon die 35 im Eingabeprompt, dort lösche ich dann die 5 und schreibe 7 und habe dann 37
kurz: kann der User den std. Wert editieren ??
Verfasst: Dienstag 29. Januar 2008, 10:15
von mathi
also das Problem mit der Funktion habe ich jetzt selbst gelöst:
für die Nachwelt:
Code: Alles auswählen
def float_input(prompt,default):
vorgabe=float(default)
eingabe=raw_input(prompt)
if not eingabe:
return vorgabe
else:
while True:
try:
eingabewert=float(eingabe)
return eingabewert
except ValueError:
print "Na das ist aber keine Zahl!"
eingabe=raw_input(prompt)
radius = float_input('Bitte den Radius eingeben: ',5)
hoehe = float_input('Und die Hoehe: ',23)
print radius
print hoehe
Verfasst: Dienstag 29. Januar 2008, 10:17
von mathi
jetzt habe ich aber trotzdem den Anspruch, den default-Wert als user im Prompt ändern zu wollen, aber wie geht sowas?
Verfasst: Dienstag 29. Januar 2008, 10:24
von CM
Was verstehst Du denn nicht? Das haben doch jetzt zwei Leute gezeigt, oder?
Verfasst: Dienstag 29. Januar 2008, 10:36
von mathi
Du hast mich nicht verstanden:
intern kann ich den defaultwert setzen, mein letzter geposteter Code zeigt das ja.
Was ich will ist, dass der Benutzer den defaultwert interaktiv bearbeiten kann! Also nicht nur der Hinweis: "Im Inneren wird der Defaultwert= 35 gesetzt" sondern ich möchte im laufenden Programm die eingabeaufforderung haben UND der Defaultwert soll dort erscheinen als wäre er vom Benutzer eingetippt und der blinkende Cursor dann nach dem Defaultwert: also für die o.g. 35 an 3. Stelle
Ich hoffe ich habe mich jetzt klarer ausdrücken können.

Verfasst: Dienstag 29. Januar 2008, 10:39
von Zap
Er meint wohl sowas. Ob das schön ist, ist ne andere Frage:
Code: Alles auswählen
def float_input(prompt, default):
while True:
answer = raw_input("%s [%s]" % (prompt, default))
if answer.startswith("default="):
default = answer.split("default=")[-1]
else:
try:
return float(True and answer or default)
except ValueError:
pass
Der Defaultwert ist dann nur für den einen Methoenaufruf geändert. Die Erinnerung ist anschließend dahin.
Diesen Komfort den du dir wünschst, dass eine Antwort hinter dem Prompt angezeigt wird und Editierbar ist kannst du nur mit speziellen Modulen erreichen.
Ich glaube ipython nutzt an der Stelle "pyreadlines".
Vielleicht findest du da was.
Verfasst: Dienstag 29. Januar 2008, 10:45
von CM
mathi hat geschrieben:intern kann ich den defaultwert setzen, mein letzter geposteter Code zeigt das ja.
Was ich will ist, dass der Benutzer den defaultwert interaktiv bearbeiten kann! Also nicht nur der Hinweis: "Im Inneren wird der Defaultwert= 35 gesetzt" sondern ich möchte im laufenden Programm die eingabeaufforderung haben UND der Defaultwert soll dort erscheinen als wäre er vom Benutzer eingetippt und der blinkende Cursor dann nach dem Defaultwert: also für die o.g. 35 an 3. Stelle
Ich weiß nicht, wer Deine Nutzer sein könnten, aber guter Stil ist es IMHO nicht. IMHO gute CLIs zeigen ggf. einen Defaultwert an. Wird dieser überschrieben, so wird er eben ausgetauscht und beim
nächsten Durchlauf angezeigt.
Aber das ist natürlich Deine Sache. Vielleicht magst Du ja dran denken, wenn User sich entsprechend äußern.
Gruß,
Christian
Verfasst: Dienstag 29. Januar 2008, 10:56
von mathi
hmmm, ok Ihr habt wohl recht, dann lass ich das und bleibe beim "guten Stil"
Vielen Dank an alle für die Antworten/Denkanstöße
Verfasst: Dienstag 29. Januar 2008, 14:25
von Leonidas
Lunar hat eben erst
sowas gepostet...
Verfasst: Mittwoch 30. Januar 2008, 10:29
von mathi
@Leonidas
Der Thread ist von mir, aber nicht zu Ende geführt. Ich komme mit dem Code leider nicht zurecht (zu wenig Erfahrung?!?).
Verfasst: Mittwoch 30. Januar 2008, 13:57
von Leonidas
mathi hat geschrieben:Der Thread ist von mir, aber nicht zu Ende geführt.
Also am besten einen neuen starten?!
Wo ist denn das Problem? Den Code kannst du doch einfach übernehmen, fertig.