BlackJack hat geschrieben:Funktionen die eine beliebige Anzahl von Argumenten und Schlüsselwortargumenten entgegen nehmen, sind IMHO magisch. Das ist etwas besonderes und kommt im Grunde auch recht selten vor.
Das halte ich für ein Gerücht. "dict()" und "dict.update()" sind nicht selten, und würden ohne ** nicht funktionieren.
Ob das magisch ist, hängt von der Funktion ab. Ich stimme dir insoweit zu, dass es schlecht ist, * oder ** zu verwenden, weil man zu faul ist, eine größeren Anzahl von Argumenten Namen zu geben. Dann ist refactoring angebracht, weil die Funktion zu viele Argumente entgegen nimmt.
Immer dann allerdings, wenn eine Funktion eine Liste oder ein Wörterbuch entgegennimmt, ist die Verwendung dieser Syntax eine Überlegung wert. Ist absehbar, dass diese Funktion Objekten aufgerufen wird, die lokal erzeugt werden, ist die Sternchensyntax imho zu bevorzugen.
Imho ist es nämlich in so einem Fall wesentlich hässlicher, ein explizites Wörterbuch zu verwenden:
Code: Alles auswählen
configfile.update({'myoption': 'foo', 'anotheroption': 'spam'})
# oder
configfile.update(myoption='foo', anotheroption='spam')
Ich persönlich halte die zweite Variante für wesentlich eleganter.
Etwas anderes ist es natürlich, wenn das Wörterbuch in den meisten Fällen direkt übergeben wird. Aber diese Fälle kann man mit geschickter Signatur eigentlich recht elegant lösen.