Parameter übergeben durch Inhalte einer Liste bzw Sequenz

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
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

Moin Moin,

hoffe, dass ich hier wieder so nette Hilfe bekomme.

Ich versuche gerade Übergabeparameter auf Listen herauszuholen, allerdings können die Anzahl der Übergabeparameter dynamisch sein (verschiedene Methoden) sollen aber immer eine feste Anzahl haben. Von PHP kenne ich es so, dass die Liste (Tuple) automatisch, wenn passend, zerlegt wird. Wie geht das bei Python?

Hier mal ein Beispiel:

Code: Alles auswählen

#ipy27.exe

class KlasseMit3Attribiten(object):
	def __init__(self,i1,i2,i3):
		self.p1=i1
		self.p2=i1+i2
		self.p3=self.p2+i3
	
	def __str__(self):
		return "%s,%s,%s\n" % (str(self.p1),str(self.p2),str(self.p3))

#Klasse mit 5 Attribute => step = 5		
step = 3
	
arrayMitVielenWerten = [1,2,3,4,5,6,7,8,9,10,11,12,13]

listOfO = []
y = len(arrayMitVielenWerten)-step
for i in range(0,y,step):

	teilarray = arrayMitVielenWerten[i:i+step]
#	myObject = KlasseMit3Attribiten(tuple(teilarray)) #funktioniert nicht
#	myObject = KlasseMit3Attribiten(for a in teilarray) #funktioniert nicht
	myObject = KlasseMit3Attribiten(teilarray[0],teilarray[1],teilarray[2]) # mit step = 5 wuerde das nicht mehr funktionieren 
	if myObject:
		listOfO.append(myObject)

for o in listOfO:
	print str(o)
Wahrscheinlich bin ich irgendwie wieder auf dem Holzweg, aber man kann ja nur lernen.
Thx
Sven
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Erzähl uns doch mal, was du eigentlich machen möchtest. Was du dort versuchst ist eigentlich keine gute Idee und der Code ist dazu noch mehr als umständlich und unübersichtlich. Da solltest du noch ein wenig aufräumen.

Sebastian
Das Leben ist wie ein Tennisball.
deets

@proofy

Zuerstmal eine kleine Verbesserung: wenn du schon string-interpolation/formatting benutzt in __str__, dann kannst du das auch gleich so machen, dass du dir das nervige str(wert) sparst:

Code: Alles auswählen

return "%i" % self.p1 # benutze integer-formatierung
Und dann zu deinem eigentlichen Problem: Du kannst verschiedene Dinge machen. Du kannst entweder ein Tupel oder eine Liste uebergeben, das heisst immer nur ein Argument, aber mit mehreren Stellen.

Du kannst auch variable argumentlisten uebergeben :

http://docs.python.org/tutorial/control ... ment-lists

Code: Alles auswählen

def foo(*args):
     print args


foo(1, 2, 3)
foo(1, 2, 3, 4)
Allerdings frage ich mich, was das bei deinem Code bringen soll. Denn in deiner Klasse greifst du ja sehr dediziert auf genau 3 Parameter zu. Geht es dir nur darum, Restargumente zu ignorieren? Dann kannst du sowas machen:

Code: Alles auswählen

def foo(a, b, c, *_rest):
      pass
Die Funktion *verlangt* 3 Argumente, aber erlaubt mehr.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

deets, ich glaube, proofy will es genau anders herum haben:

Code: Alles auswählen

def foo(a, b):
    return a + b

args = [3, 4]
print foo(*args)
Stellt man einer Sequenz einen "*" voran, wird diese automatisch auf die Parameter der Funktion (oder Methode) aufgeteilt - die Länge muss natürlich passen. Der "*" in der Parameterliste sorgt dafür, dass eine Funktion (oder Methode) beliebig viele zusätzliche Argumente akzeptiert, die dann alle in diesem Parameter gesammelt werden.

Stefan
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich habe etwas in diese Richtung verstanden:

Code: Alles auswählen

>>> def foo(a, b, c):
...     print a, b, c
... 
>>> params = range(10)                                                                            
>>> foo(*params[::2][:foo.__code__.co_argcount])                                      
0 2 4                                                                                   
>>> 
Dann würde ich allerdings lieber ein Tupel oder ein Dictionary übergeben.
Das Leben ist wie ein Tennisball.
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

sma hat geschrieben:

Code: Alles auswählen

def foo(a, b):
    return a + b
args = [3, 4]
print foo(*args)
Stellt man einer Sequenz einen "*" voran, wird diese automatisch auf die Parameter der Funktion (oder Methode) aufgeteilt - die Länge muss natürlich passen. Der "*" in der Parameterliste sorgt dafür, dass eine Funktion (oder Methode) beliebig viele zusätzliche Argumente akzeptiert, die dann alle in diesem Parameter gesammelt werden.

Stefan
Danke Stefan, genau das habe ich gesucht.

@EyDu
Ich benötige es, um aus Teilen eines Array Objekte zu erzeugen, also ein deserializer. Dabei gibt es unterschiedliche Objekte.
Dein Vorschlag sieht für mich als Python Anfänger mal wieder sehr magisch aus .. ;)
Antworten