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

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: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

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: Alles auswählen

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

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).
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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

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