10 Stimmen

Python: Übergabe von Flags an Funktionen

Für eine lange Zeit habe ich versucht, herauszufinden, was ist der beste Weg, um Flags an Python-Funktionen übergeben. Der einfachste Weg ist etwas wie:

def func(data, flag1, flag2, flag3):
    ...

func(my_data, True, False, True)

Das ist wirklich schön und prägnant, aber unglaublich schwer zu lesen, da das Wort "True" oder "False" nichts darüber aussagt, welches Flag gesetzt wird, und man die Argumente sorgfältig von links nach rechts zählen muss. Man kann sie zu Schlüsselwortargumenten machen:

def func(data, flag1=False, flag2=False, flag3=False):
    ...

func(my_data, flag1=True, flag3=True)

aber das ist irgendwie überflüssig, da das "True" überhaupt keine Bedeutung hat. Ich könnte es als Liste übergeben:

func(mydata, ['flag1', 'flag3'])

または

func(mydata, [func.flag1, func.flag3])

Aber das erste fühlt sich ziemlich schmutzig an, da es Zeichenketten als Flaggen verwendet, und das zweite ist immer noch etwas repetitiv. Im Idealfall möchte ich etwas sagen wie:

func(my_data, flag1, flag3)

um Flags an eine Funktion mit minimaler Ausführlichkeit und Redundanz zu übergeben. Gibt es eine Möglichkeit, etwas wie dies in Python zu tun?

EDIT: Ich entschied mich für:

func(mydata, flagA=1, flagB=1)

vor allem aus den genannten Gründen: Überprüfung bei der Kompilierung (im Gegensatz zur Übergabe von Zeichenketten), keine Verschmutzung des Namensraums (im Gegensatz zur Verwendung globaler "ENUM "s) und minimaler Ballast (=1 oder =0 besteht aus nur 2 Zeichen, im Gegensatz zu 5 oder 6 für =True oder =False). Es macht auch das Setzen von Standardwerten für die Flags sehr einfach:

def func(data, flagA=1, flagB=0, flagC=1):
    ...

was weitaus übersichtlicher und einfacher ist, als durch Reifen zu springen, um Standardwerte zu extrahieren und **kwarg-ähnlichen Flags zuzuweisen. Die Flags werden grundsätzlich statisch geprüft und sind sehr klar und sauber zu schreiben. Wenn ich jetzt nur noch die letzten beiden Zeichen abschneiden könnte...

-1voto

Keith Punkte 40296

Ich bevorzuge Funktionen ohne Flaggen. Lieber dies tun:

def func_flag1(arg):
    pass # something useful

def func_flag2(arg):
    pass # something for flag 2.

Aber "flagX" würde eigentlich etwas Sinnvolles wie "do_X_with_option" sein.

Ich bevorzuge dies, weil es klarer ist, die Funktionen einfacher sind (weniger Bugs) und man einige Konstanten nicht in andere Module übertragen muss (im Falle von Flags, die eine Art Aufzählung sind).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X