Seite 1 von 1

"Sternchenvariablen" und Dekoratoren

Verfasst: Donnerstag 2. März 2006, 11:02
von Francesco
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.

Verfasst: Donnerstag 2. März 2006, 11:33
von jens
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?

Verfasst: Donnerstag 2. März 2006, 11:38
von Francesco
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).

Verfasst: Donnerstag 2. März 2006, 16:59
von Joghurt
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)

Verfasst: Donnerstag 2. März 2006, 19:43
von Francesco
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. :)