Seltsames Verhalten von *args

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
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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
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.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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!
Zuletzt geändert von anogayales am Donnerstag 9. Juni 2011, 14:56, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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