Befehl über raw_input() ausführen

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
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

mit diesem Konsstrukt:

Code: Alles auswählen

def abfrage(run):
    print('Ausführen, ja (ENTER) oder nein? '),
    eingabe = raw_input()
    if eingabe == 'ja' or eingabe == '':
        print('Auftrag wird ausgeführt!')
        run
    if eingabe == 'nein':
        print('Abbruch!')
    if eingabe != 'ja' and eingabe != '' and eingabe != 'nein':
        print('Was möchten Sie tun?')
würde ich gerne über ein anderes Script, einen Befehl ausführen.

Beispiel:

Code: Alles auswählen

from __modul_not_double__ import get_not_double
run = get_not_double(liste_ean_double_path, 0)
abfrage(run)
Leider funktioniert das so nicht, der Befehl 'get_not_double(liste_ean_double_path, 0)' wird immer schon vor der Abfrage ausgeführt. Ich möchte aber, daß der Befehl erst bei der Abfrage raw_input() danach ausgeführt werden soll, wenn ich dies mit 'ja' oder mit 'Enter' bestätige, sonst nicht.

Ist das möglich und wenn ja, was mache ich falsch und wie sollte es richtig aussehen und funktionieren?

Grüße Nobuddy
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo,

das Modul functools hilft da weiter:

Code: Alles auswählen

run = functools.partial(get_not_double, liste_ean_double_path, 0)
Bei deinem run in der abfrage-Funktion fehlen übrigens noch die Klammern, damit die Funktion gestartet wird.

Ein paar Anmerkungen hätte ich auch noch:
- Du solltest Eingabe und Verarbeitung trennen. Schreibe eine Funktion, welche nur die Frage stellt und True für "ja" und "False für "nein" zurückgibt und die Abfrage so lange wiederholt, bis ein gültiger Wert eingegeben wurde.
- Verwende ``elif``s
- Ich würde die Eingaben nicht mit == testen, sondern in der Form ``if eingabe in ["ja", ""]``. Dann kannst du beliebig viele gültige Werte machen.
- Verwende ``else``, dann sparst du dir die letzte Abfrage
- Vermische nicht Deutsch und Englisch, entscheide dich für eine Sprache
- ``liste`` als Teil eines Names ist unglücklich. Man sollte zum einen am Namen erkennen, was sich darin befindet und zum anderen müsstest du alle Vorkommnisse des Namens anpassen, wenn sich der Typ ändert.
- modul_not_double und get_not_double hören sich verdächtig falsch an (und sind der grausamste Mix aus Deutsch und Englisch)
- Lass die Namensgebung mit den doppelten Unterstrichen am Anfang und am Ende
- Da du noch Python 2.x verwendest gehören keine Klammern um die Werte bei print.

Sebastian
Das Leben ist wie ein Tennisball.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

EyDu, Danke für die Info, mit functools und Deinen weiteren Infos, funktioniert es jetzt.

Mein Handicap ist Englisch, da versuche ich mich langfristig hinein zuarbeiten, daher für Dich auch der chaotische Mix aus Deutsch und Englisch. :wink:

Eine Extrafunktion für die Frage, wird da nicht das Ganze zu sehr aufgebläht?

Das mit 'True für "ja" und "False für "nein" zurückgibt', das ist mir noch nicht ganz klar.
Vielleicht ein kurzes Beispiel?

Das mit der 'liste', hat schon so seinen Sinn. Dahinter versteckt sich eine Textdatei inklusive Pfad.

Das mit den Klammern bei print, habe ich mir so angeeignet, da ja python 3 dies so ist.

Mein Konstrukt, mit dem ich die Abfrage steuere, sieht momentan jetzt so aus:

Code: Alles auswählen

import functools
from __modul_not_double__ import get_not_double

frage = ('Möchten Sie den EAN-Code aktualisieren?')
info = ('EAN-Code aktualisieren,')
run = functools.partial(get_not_double, liste_ean_double_path, 0)
abfrage(frage, info, run)
und das Konstrukt mit der Abfrage so:

Code: Alles auswählen

def abfrage(frage, info, run):
    eingabe = False
    while eingabe != True:
        print(frage)
        print('ja (ENTER) oder nein? '),
        eingabe = raw_input()
        print('')
        if eingabe in ["ja", ""]:
            print(info + ' wird ausgeführt!')
            run()
            eingabe = True
        elif eingabe in 'nein':
            print('Abbruch!')
            break
        elif eingabe not in ['ja', '', 'nein']:
            print('Was möchten Sie tun?')
Da gibt es bestimmt noch Einiges zu bemängeln, hoffe aber daß ich auf dem richtigen Weg bin.

Grüße Nobuddy
Antworten