Seite 1 von 1

Seltsames Verhalten von *args

Verfasst: Donnerstag 9. Juni 2011, 14:41
von anogayales
Hallo allerseits,

ich möchte hier nicht eine Metadiskussion lostreten bei der es um: "Es gibt kein seltsames Verhalten, steht doch in der Spezifikation" geht. Trotzdem möchte ich euch folden Codesnippet zeigen. btw: ich hab mir nicht die Spezifikation angeguckt :)

Code: Alles auswählen

def test_var_args_call(arg1=None, *args):
    print "arg1:", arg1
    for arg in args:
        print arg

test_var_args_call(1,2,3,4,5,6)
Was ich erwarten würde, wäre folgende Ausgabe:

Code: Alles auswählen

arg1: None
1
2
3
4
5
6
Ich bekomme aber folgende:

Code: Alles auswählen

arg1: 1
2
3
4
5
6
Obwohl arg1 ein Keyword argument ist wird es bei der Parameterübergabe als normales Argument angesehen? Oder sehe ich hier etwas falsch?

Gibt es eine Möglichkeit wie ich trotzdem dieses Verhalten bekomme?

Grüße,
anogayales

Re: Seltsames Verhalten von *args

Verfasst: Donnerstag 9. Juni 2011, 14:52
von BlackJack
@anogayales: Das ist kein seltsames verhalten sondern eine seltsame Erwartung Deinerseits. :-P

Natürlich werden Argumente der Reihe nach auf die formalen Parameter der Funktionsdefinition verteilt. Auch bei Schlüsselwort-Argumenten. Da Du ja Python nicht erst seit gestern kennst, wundert mich Deine Erwartung ein wenig, da Du das doch sicher schon *gesehen* hast, dass man Schlüsselwortargumente nicht zwingend mit dem Schlüsselwort aufrufen muss. Das wäre dann ja die Alternative.

Wenn Du das Verhalten haben möchtest, musst Du mit `**kargs` arbeiten.

Re: Seltsames Verhalten von *args

Verfasst: Donnerstag 9. Juni 2011, 14:55
von anogayales
Vielen Dank für deine Antwort. Das man kwargs ohne Schlüsselwort aufrufen kann habe ich im Eifer des Gefechts vergessen. Dann macht das oben genannte Verhalten auch wieder Sinn :P Ich hab das Zen of Python mal wieder zu wörtlich genommen:

Code: Alles auswählen

Explicit is better than implicit.
Wenn ich doch schon Schlüsselwörte habe, dann soll ich sie auch explizit ansprechen. Naja was solls :P

Vielen Dank!

Re: Seltsames Verhalten von *args

Verfasst: Donnerstag 9. Juni 2011, 14:55
von cofi
Nur in Python 3 gibt es keyword-only Argumente, in Python 2 kannst du mit beliebig vielen, durchaus zu den keyword-Argumenten durchkommen.

Das Verhalten bekommst du leider nur in Python 3, in Python 2 muss ein *args nach keyword argumenten kommen. Oder du benutzt **kwargs, wobei dir dann leider die Information aus der Signatur abhanden kommt.