"Sternchenvariablen" und Dekoratoren

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.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

"Sternchenvariablen" und Dekoratoren

Beitragvon Francesco » Donnerstag 2. März 2006, 11:02

Hallo Leute,

ich habe zwei Fragen:

1) Wie ist das mit den "Sternchenvariablen"
(habe in der Python Dokumentation keine ausreichende Information gefunden)

oft sieht man
def myfunction (*arg, **kwargs)

und wie ruft man das auf?

2) Dekoratoren:

Weiss wer eine Seite, wo das gut beschrieben ist?
mit sinnvollen Anwendungsbeispiel?
Oder kann irgendwer von Euch sagen, dass er das schon
mal angewendet hat und für ihn/ihr nützlich war?

Danke.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 2. März 2006, 11:33

Zu 1.:

Code: Alles auswählen

def test(*args, **kwargs):
    print "args:", args
    print "kwargs:", kwargs


test("eins", "zwei", drei=3, vier=4)

Ausgabe:
args: ('eins', 'zwei')
kwargs: {'drei': 3, 'vier': 4}

Das erklärt alles, oder?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Donnerstag 2. März 2006, 11:38

Noch etwas:
Die Verwendung von *sorted ist mir hier nicht klar.
(Weiss nicht mehr von wo ich das herhab).
sort list with another list
[code=]
>>> A=['hello','there','this','that']
>>> B=[3,4,2,5]
>>> zip(*sorted(zip(B,A)))[1]
('this', 'hello', 'there', 'that')
[/code]


Code: Alles auswählen

e = sorted(zip(B,A))
e
[(2, 'this'), (3, 'hello'), (4, 'there'), (5, 'that')]



*e entspricht dann:

Code: Alles auswählen

(2, 'this'), (3, 'hello'), (4, 'there'), (5, 'that')

wenn ich schreibe:

Code: Alles auswählen

>>> tuple(e)
((2, 'this'), (3, 'hello'), (4, 'there'), (5, 'that'))


zip(tuple(e))[1]

dann funktioniert es wieder nicht

mit

Code: Alles auswählen

zip((2, 'this'), (3, 'hello'), (4, 'there'), (5, 'that'))[1]

schon (was auch *e anscheinend entspricht).
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Donnerstag 2. März 2006, 16:59

Bei

Code: Alles auswählen

a=[1,2,3]
f(a)
wird f mit a als parameter aufgerufen
Bei

Code: Alles auswählen

a=[1,2,3]
f(*a)
wird f als

Code: Alles auswählen

f(1,2,3)
aufgerufen.

Das * kannst du nicht emulieren (außer durch eval etc.), sonst wäre es ja auch sinnfrei.
(OK, mit apply geht es, das war früher die Methode, für die nun * eingeführt wurde)
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Donnerstag 2. März 2006, 19:43

Joghurt hat geschrieben:Bei

Code: Alles auswählen

a=[1,2,3]
f(a)
wird f mit a als parameter aufgerufen
Bei

Code: Alles auswählen

a=[1,2,3]
f(*a)
wird f als

Code: Alles auswählen

f(1,2,3)
aufgerufen.

Das * kannst du nicht emulieren (außer durch eval etc.), sonst wäre es ja auch sinnfrei.
(OK, mit apply geht es, das war früher die Methode, für die nun * eingeführt wurde)


Joghurt, danke für deine Erklärung. :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder