Wert in Konsole vorgeben

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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 ??
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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
Zuletzt geändert von mathi am Dienstag 29. Januar 2008, 10:52, insgesamt 1-mal geändert.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

jetzt habe ich aber trotzdem den Anspruch, den default-Wert als user im Prompt ändern zu wollen, aber wie geht sowas?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Was verstehst Du denn nicht? Das haben doch jetzt zwei Leute gezeigt, oder?
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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. :?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
Zuletzt geändert von Zap am Dienstag 29. Januar 2008, 10:52, insgesamt 1-mal geändert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

hmmm, ok Ihr habt wohl recht, dann lass ich das und bleibe beim "guten Stil" :wink:

Vielen Dank an alle für die Antworten/Denkanstöße
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Lunar hat eben erst sowas gepostet...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

@Leonidas

Der Thread ist von mir, aber nicht zu Ende geführt. Ich komme mit dem Code leider nicht zurecht (zu wenig Erfahrung?!?).
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten