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...