Anwendungsfälle *args & **kwargs

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
brave
User
Beiträge: 24
Registriert: Mittwoch 24. Februar 2016, 18:30

Hallo,

bin noch recht frisch mit Python unterwegs und bekomme einige Dinge nicht in meinen Kopf, oder sagen wir mal nur so halb.
Es geht um *args und **kwargs. Direkt vorweg: Ich habe, so glaube ich zumindest, grundsätzlich verstanden wie *args und **kwargs als Parameter in Methoden/Funktionen funktionieren. Mir erschließt sich aber nur unzureichend was ich damit anstellen kann und welchen Vorteil Sie mir bringen. Einzig in Verbindung mit argparse() um ein Kommandozeilen-Script zu bauen würde ich das als nützlich empfinden. Alles andere ist doch total umständlich. Hier ein einfaches Beispiel was ich mir ausgedacht habe, als ich mit den Argumenten-Containern herumgespielt habe. Die Funktion addiert einfach nur zahlen. Einmal so wie ich alles bisher programmiere, also nur positionelle Argumente und einmal mit Arg-Containern.

Code: Alles auswählen

def money(gehalt, bonus, weihnachtsgeld=0, ueberstunden=0):        
    if ueberstunden > 0:                                           
        return gehalt + ueberstunden * bonus + weihnachtsgeld      
    else:                                                          
        return gehalt + weihnachtsgeld                             
                                                                   
                                                                   
def money_args(*args, **kwargs):                                   
                                                                   
    if len(args) == 2:                                             
        gehalt = args[0]                                           
        bonus = args[1]                                            
    else:                                                          
        return "Da ist wohl was falsch eingegeben worden!"         
                                                                   
    ueberstunden = 0                                               
    weihnachtsgeld = 0                                             
                                                                   
    for key, value in kwargs.items():                              
        if key == 'ueberstunden': ueberstunden = value             
        if key == 'weihnachtsgeld': weihnachtsgeld = value         
                                                                   
    return gehalt + ueberstunden * bonus + weihnachtsgeld          
                                                                   
                                                                   
print(money(3000, 20, ueberstunden=0, weihnachtsgeld=2000))        
print(money_args(3000, 20, ueberstunden=10, weihnachtsgeld=2000))     
Man kann ja ganz deutlich erkennen, dass Variante 2 extrem unhandlich ist, weil man die Args erstmal alle parsen und auswerten und auf Richtigkeit und weiß der Geier was noch alles abfangen muss, was der Nutzer falsch eingeben kann.

Also, kann mir mal jemand sagen wann und sowas überhaupt anwendet und was so die best practise im Umgang damit ist?
Kann mir kaum vorstellen, dass man sowas wie oben so benutzen würde.

danke euch
brave
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@brave: wie Du bereits gemerkt hast ist es oft nicht sinnvoll mit *-Magie zu arbeiten, vor allem wenn man auch konkrete Parameter benutzen könnte. Manchmal denken Programmierer, dass sie *args einer Liste als Argument vorziehen sollten, was aber meist auch keine so gute Idee ist. Hauptsächlich kommt *args und **kwargs bei Wrappern zum Einsatz.
BlackJack

@brave: „Best practice“ ist es das so wenig wie möglich zu benutzen, weil es umständlich, magisch, und schwer zu durchschauen ist. Wie Sirius3 schon schrieb kommt das öfter mal in Wrappern vor und anderen Stellen wo man Argumente an eine Funktion oder Methode weiterreichen möchte deren Signatur man nicht kennt. Wo **kwargs auch zum Einsatz kommt, sind Funktionen/Methoden mit sehr vielen optionalen Schlüsselwortargumenten. Wobei man auch das eher vermeiden sollte. Tkinter ist ein Beispiel das diese Technik sehr viel verwendet.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hier mal ein Beispiel.

Code: Alles auswählen

>>> def addiere(*args):
	return sum(args)

>>> addiere(1, 2, 3)
6
>>> addiere(1)
1
>>> addiere(*range(10))
45
Über die Sinnhaftigkeit kann man diskutieren, aber das ist schon etwas anderes als das tatsächlich sinnlose Beispiel aus der ursprünglichen Fragestellung.
Antworten