Seite 1 von 1

Code vereinfachen

Verfasst: Samstag 24. September 2011, 13:11
von CoC4
Hallo Leute,

ich versuche mich gerade an einer etwas komplexeren Aufgabe und möchte dabei meinen Code einfacher und lesbarer machen. Da ich es aber leider nicht besser weiß, kommen immer wieder sich-wiederholende Strukturen vor, die ich gerne durch eine klarere Anweisung umgehen würde. Im Moment sieht das Ganze (abstrakt) noch so aus:

Code: Alles auswählen

def callback():

    # Variablen auslesen    
    var1 = var_eins.get()
    print "Inhalt: ", var1
    
    var2 = var_zwei.get()
    print "Länge: ", var2
    
    var3 = var_drei.get()
    print "Klassen: ", var3

    # ...

usw.

Ich würde das gerne so vereinfachen, dass ich den Ablauf ein einziges mal definiere und sich die Variablen (z.B. durch eine vorherige Definition) sozusagen von selbst abarbeiten. Pseudo-Code:

Code: Alles auswählen

def callback():
    x = x in range(10)
    y = ['eins', 'zwei', 'drei', ...]
    var<x> = var<y>.get()
    print<Inhalt>, var<x>
(Wie) Geht das?

Vielen Dank schonmal!

Re: Code vereinfachen

Verfasst: Samstag 24. September 2011, 13:15
von jbs
Eine Nummerierung von Variablen ist eigentich immer schlecht - da bieten sich listen an. Wo kommen denn var_eins, etc denn her?

Aber so wie es aussieht suchst du nach dicts.

Re: Code vereinfachen

Verfasst: Samstag 24. September 2011, 13:19
von CoC4
Die Variablen lesen Zustände aus Benutzeingaben aus und nehmen nur '1' oder '0' ein. Wenn der Benutzer die Variable auf '1' setzt, so wird eine Berechnung/Funktion ausgelöst. Da die Optionen halt ziemlich viele sind muss ich den Code (weil ichs eben nicht besser weiß) auch genauso oft wiederholen wie ich optionen hab...

Re: Code vereinfachen

Verfasst: Samstag 24. September 2011, 13:30
von jbs
Das klingt schon sehr nach dict.

Code: Alles auswählen

def func_x(): pass
def func_y(): pass

operations = {
    'do_x': func_x,
    'do_y': func_y, 
}

def ask_for_operations():
    for op, func in operations.items():
        if raw_input(op) == '1':
            yield func

for func in ask_for_operations():
    func()

Re: Code vereinfachen

Verfasst: Samstag 24. September 2011, 13:37
von CoC4
Super, danke!

Ok, also über ein dictionary diejenigen funktionen aufrufen, die ich brauche...
'yield' übergibt dann die funktion wieder, richtig?

Und nur zum Verständnis für mich: die letzten beiden Zeilen deines Codes sind einfach die Anweisung zur Ausführung?

Re: Code vereinfachen

Verfasst: Samstag 24. September 2011, 13:41
von jbs
Man kann auch direkt in der Zeile biem yield die Funktionen aufrufen. Es ging mir darum das Prinzip zu zeigen, wie man dicts dafür verwenden kann.

Vielleicht täte es dir nicht schlecht, einmal die Grundlagen von Python durch zu arbeiten.

Re: Code vereinfachen

Verfasst: Samstag 24. September 2011, 13:45
von CoC4
Ich komm einfach manchmal aufs Einfachste nicht... :lol:

Und nochmal danke für die Veranschaulichung - das hilft mir ein großes Stück weiter!

Re: Code vereinfachen

Verfasst: Samstag 24. September 2011, 15:17
von derdon
jbs: Du hast die Klammern vergessen, um die Funktion ask_for_operations auch aufzurufen (schließlich kann man nicht über eine Funktion iterieren). Die letzten beiden Zeilen müssten also so lauten:

Code: Alles auswählen

for func in ask_for_operations():
    func()

Re: Code vereinfachen

Verfasst: Samstag 24. September 2011, 18:57
von jbs
:oops:

Danke, ist geändert.