"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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

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

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

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

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