Seite 1 von 1

Unbekannte Anzahl von Parameter: Wie übergeben???

Verfasst: Freitag 25. Januar 2008, 19:17
von akis.kapo
Hallo alle,

ich habe wieder eine grundsätzliche Frage.

Code: Alles auswählen

from struct import pack
pack( fmt, v1, v2, ...)
Return a string containing the values v1, v2, ... packed according to the given format. The arguments must match the values required by the format exactly.
fmt ist ein String, zum Beispiel "QQQ".

v1, ..., v3 die dazugehörigen Werte.

Was wenn, ...

1. Ich algorithmisch bestimme, wie fmt aussieht.
(Kann man ja in python extra komfortabel mit "Q" + "Q" + "Q" oder 3*"Q" setzen)
2. Es abhängig vom Algorithmus ist, wie viele Parameterwerte v1, ..., vN folgen.
(Ich es im vornhinein also als Entwickler nicht weiss.)

Ich kenne das resultierende fmt und ich hab eine Liste mit genau v1, ..., vN.

Beispielcode:
(Entspricht nicht meinem Code, ist aber ein minimales Beispiel, welches das Problem widerspiegelt.)

Code: Alles auswählen

def magische_funktion(eingabe):
    i = eingabe + 42
    parameterliste = []
    for j in xrange(i):
        parameterliste.append(j)
    return i*"Q", parameterliste
Wie bringe ich meine Parameter v1, ..., vN, die ich momentan in einer Liste speicher, in diese pack() Funktion?

Geht das überhaupt?
Ich bin am zweifeln.

Verfasst: Freitag 25. Januar 2008, 19:22
von EyDu
Da schaust du am besten noch mal ins Python-Tutorial. Stichworte: Arbitrary Argument Lists / Keyword Arguments und Tuple Unpacking. Da ist es ganz gut erklärt.

Verfasst: Freitag 25. Januar 2008, 19:43
von akis.kapo
Also mit anderen Worten:

Code: Alles auswählen

def magische_funktion(eingabe):
    i = eingabe + 42
    parameterliste = []
    for j in xrange(i):
        parameterliste.append(j)
    return i*"Q", parameterliste

pack_args = magische_funktion(1337)


pack(pack_args[0], *pack_args[1])
Richtig?

Verfasst: Freitag 25. Januar 2008, 19:48
von EyDu
Ja, genau.

Verfasst: Freitag 25. Januar 2008, 19:52
von akis.kapo
Was bin ich bloß für ein Tier? 8)

Verfasst: Freitag 25. Januar 2008, 20:14
von BlackJack
Wenn das immer der gleiche Datentyp ist, wäre vielleicht auch das `array`-Modul geeigneter als `struct`.

Falls es wirklich komplexere Strukturen sind, und es auch ein externes Paket sein darf, ist Construct ein Blick wert.

Verfasst: Freitag 25. Januar 2008, 20:38
von akis.kapo
EDIT:
Hat sich erledigt.

Verfasst: Freitag 25. Januar 2008, 20:53
von BlackJack
In einfachen Worten: `numarray` hat nichts mit `construct` zu tun. Das sind zwei verschiedene Module für völlig unterschiedliche Aufgaben.

Ich meinte auch das `array`-Modul aus der Standardbibliothek und keines zum "rechnen". Das ist für Arrays ähnlich denen in C wo jedes Element ein C-Grunddatentyp ist. Das heisst das kannst Du nur gebrauchen, wenn Du viele `unsigned long long` hast.

Wenn es Strukturen mit verschiedenen Datentypen sind, dann ist das `construct`-Modul etwas umfangreicher als `struct` und bietet Objekte mit Attributen statt einfacher Tupel.