Seite 1 von 2

Funktionsaufruf

Verfasst: Montag 19. Oktober 2009, 13:49
von Ned Nederlander
Hallo :-)

Ich bin dabei ein kleines Programm zu schreiben.

Ich habe ein Klasse, die als Eingabe solch ein Konstruckt benötigt:

([(0.47, 0.50, 8),(0.67, 0.70, 4),(0.82, 0.85, 2)], 1)

Wenn ich die Klasse mit solch einer Eingae aufrufe, funktioniert alles wunderbar.

Ich möchte die Klasse allerdings mittels einer for-Schleife mehrfach durchlaufen lassen. Die Schleife soll dabei über eine Liste/Tupel laufen. Wenn ich dies allerdings mache, zum Beispiel mit 2 Werte-Konfigurationen:

[[[(0.47, 0.50, 8),(0.67, 0.70, 4),(0.82, 0.85, 2)], 1],
[[(0.50, 0.55, 10),(0.75, 0.80, 3),(0.82, 0.85, 2)], 1]]

bekomme ich den Fehler "TypeError: 'list' object is not callable"

Irgendwie kann ich also nicht richtig über die Werte iterieren.

Leider bin ich wirklich kein erfahrener Programmierer, wäre nett wenn mir jemand einen Tipp geben könnte.

Vielen Dank!

Verfasst: Montag 19. Oktober 2009, 13:54
von nemomuk
Wenn du etwas mehr Code zeigst, wäre das hilfreich.

Verfasst: Montag 19. Oktober 2009, 14:09
von BlackJack
@Ned Nederlander: Wenn ich mal raten müsste hast Du irgendwo auf Modulebene den Namen einer Funktion an eine Liste gebunden. Womit dann der Aufruf nicht mehr funktioniert, denn Listen sind nicht aufrufbar. Wie die Fehlermeldung ja recht deutlich sagt. Wenn Du das nächste mal den kompletten Traceback und nicht nur die letzte Zeile zeigst, hätte man auch schon sagen können welchen Namen Du neu bindest.

Code: Alles auswählen

In [37]: def spam():
   ....:     print 'Hallo'
   ....:

In [38]: spam()
Hallo

In [39]: spam = [1, 2, 3]

In [40]: spam()
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: 'list' object is not callable

Verfasst: Montag 19. Oktober 2009, 14:20
von Ned Nederlander
Ok, ich machs mal etwas ausführlicher:

Code: Alles auswählen

LISTE = [[[(0.47, 0.50, 8),(0.67, 0.70, 4),(0.82, 0.85, 2)], 1],[[(0.50, 0.55, 10),(0.75, 0.80, 3),(0.82, 0.85, 2)], 1]]

 

for i in AdaptiveTriggers:
    print "\n\n# Adaptiver Trigger: " + str(i)
        
    listeOfAdaptive = []
     


    at = AdaptiveTrigger([(0.47, 0.50, 8),(0.67, 0.70, 4),(0.82, 0.85, 2)], 1)
    at2 = AdaptiveTrigger(LISTE[i])
..............


das hier ist der wesentliche teil.

der aufruf "at = ..." funktioniert. wenn ich allerdings durch die liste mit den werten iterieren will, wie bei "at2 = ...", funktionierts leider nicht.

Verfasst: Montag 19. Oktober 2009, 14:24
von Hyperion
Pack Deinen Code mal in die code-Tags bitte!

Verfasst: Montag 19. Oktober 2009, 14:24
von CM

Code: Alles auswählen

LISTE[i]
statt

Code: Alles auswählen

LISTE(i)
?

Dein Code ist schwer zu lesen - magst Du vielleicht Code-Tags benutzen?

HTH
Christian

Verfasst: Montag 19. Oktober 2009, 14:37
von Ned Nederlander
entschuldigung, ich habs soeben editiert.

die möglichkeit mit

Liste

stimmt natürlich. ich habs mit beiden möglichkeiten probiert :)

bei dieser variante bekomm ich allerdings den fehler:

"TypeError: list indices must be integers"

ich weiss leider nicht wieso die indices keine integers sein sollen. die klamerung scheint zu stimmen, eigentlich sollte er doch beide listen-elemente erkennen.

Verfasst: Montag 19. Oktober 2009, 14:49
von CM

Code: Alles auswählen

for element in my_list:
    at2 = AdaptiveTrigger(element)
müsste direkt mit der Liste initialisieren.

Also, mir scheint, Du solltest nochmal das Tutorial lesen. Was auch immer "AdaptiveTriggers" sind, es sind keine Integer ;-). Und über die Dinger iterierst Du ja.

Misschien kun je ook beter ergens anders vragen dan hier? ;-)

Christian

Verfasst: Montag 19. Oktober 2009, 15:06
von Ned Nederlander
vorweg: ich bin kein holländer :-)

wenn ich diese möglichkeit

Code: Alles auswählen

for element in my_list:
    at2 = AdaptiveTrigger(element)
durchlaufen lasse, kommt die meldung:

TypeError: __init__() takes exactly 3 arguments (2 given)


und ich glaube das ist auch das eigentliche problem. irgendwie scheint python die beiden elemente der liste nicht als solche zu erkennen. ein element der liste besteht aus einer eingabe für die klasse, die allerdings selbst nochmal mehrere elemente beinhaltet. irgendwie scheint python das nicht richtig interpretieren zu können.

Verfasst: Montag 19. Oktober 2009, 15:22
von Hyperion
Ned Nederlander hat geschrieben: TypeError: __init__() takes exactly 3 arguments (2 given)
Na die Fehlermeldung ist doch eindeutig. Die Klasse will zwei explizite Parameter haben, Du übergibst aber nur einen. Was will die Klasse denn genau haben? Und was verbirgt sich hinter element?

Verfasst: Montag 19. Oktober 2009, 15:24
von CM
Hyperion hat geschrieben:Und was verbirgt sich hinter element?
Eine seltsam verschachtelte Liste - und das könnte das Problem sein. Nicht etwa was Python versteht oder nicht. ;-)

Aber Hyperions's Fragen kann ich mich nur anschliessen.

Verfasst: Montag 19. Oktober 2009, 15:25
von BlackJack
@Ned Nederlander: Es ist nicht Python das etwas nicht richtig interpretieren kann, sondern Du. Ein Tupel oder eine Liste mit zwei Elementen ist *ein* Objekt. Wenn Python das einfach so bei Funktionsaufrufen auf mehrere Argumente verteilt, wie willst Du dann so ein Objekt als *ein* Argument übergeben? Oder soll Python die Gedanken des Programmierers lesen und das jeweils das machen, was er sich gerade denkt!?

Binde den Inhalt des Arguments in der Schleife an zwei Namen und übergib die als einzelne Argumente, oder benutze den ``*`` beim Aufruf des Klassenobjekts. Ich würde die Variante mit den Namen verwenden. Die ist weniger "magic" und man kann bei sinnvoll gewählten Namen das Programm besser verstehen.

Verfasst: Montag 19. Oktober 2009, 15:29
von Ned Nederlander
wie oben schon beschrieben beinhaltet die liste solche konstrukte:

Code: Alles auswählen

([(0.47, 0.50, 8),(0.67, 0.70, 4),(0.82, 0.85, 2)], 1)

wenn ich "i" jeweils pro schleifendurchlauf ausdrucke, druckt er auch brav diese dinger aus. deswegen versteh ich nicht, wieso es ein problem ist, wenn ich "i" der klasse übergebe.

rufe ich die klasse so auf:

Code: Alles auswählen

at = AdaptiveTrigger([(0.47, 0.50, 8),(0.67, 0.70, 4),(0.82, 0.85, 2)], 1)
funktioniert es tadellos.

iteriere ich über die liste:

Code: Alles auswählen

at = AdaptiveTrigger(AdaptiveTriggers(i))
beschwert er sich :(


gibt es ne möglichkeit, python klar zu machen, dass er die werte korrekt einliest?

Verfasst: Montag 19. Oktober 2009, 15:34
von CM
Was ist denn AdaptiveTriggers? Eine Klasse, die bei Initialisierung eine Liste zurückgibt??? Das wäre sehr strange.

Und was ist der relevante Code? Und die dazugehörige Fehlermeldung? Vielleicht mal auf PEP 8 achten? Dein Code ist nämlich schlecht lesbar.

Verfasst: Montag 19. Oktober 2009, 15:36
von Hyperion
Ned Nederlander hat geschrieben:wie oben schon beschrieben beinhaltet die liste solche konstrukte:

Code: Alles auswählen

([(0.47, 0.50, 8),(0.67, 0.70, 4),(0.82, 0.85, 2)], 1)
Siehst Du Klammern außen drum rum?
Das führt zu:

Code: Alles auswählen

at = AdaptiveTrigger(([(0.47, 0.50, 8),(0.67, 0.70, 4),(0.82, 0.85, 2)], 1))
Damit ist es nur noch ein Parameter!

BlackJack hat Dir das doch schon geschrieben ;-)

Generell zeigst Du viel Code, der mal so mal so aussieht. Ich steige da nicht mehr durch, was wie zusammen gehört.

Verfasst: Montag 19. Oktober 2009, 15:38
von EyDu
Nur mal so geraten:

Code: Alles auswählen

for element in my_list:
    at2 = AdaptiveTrigger(*element)
http://docs.python.org/tutorial/control ... ment-lists

Verfasst: Montag 19. Oktober 2009, 15:46
von Ned Nederlander
habs nun in 2 parameter aufgeteilt, und es scheint auch bisher wunderbar zu funktionieren.


ich sitz schon ne weile an dem problem und irgendwann sieht man den wald vor lauter bäumen nicht mehr.


danke erstmal an alle!

Verfasst: Montag 19. Oktober 2009, 15:50
von Hyperion
@Ned: Das liegt aber in diesem Falle vor allem an den magischen Verschachtelungen ;-) Wieso muss das so dermaßen verschachtelt sein? Wieso ohne eigene Namen für die Elemente der Liste?

Verfasst: Montag 19. Oktober 2009, 15:55
von Ned Nederlander
Hyperion hat geschrieben:@Ned: Das liegt aber in diesem Falle vor allem an den magischen Verschachtelungen ;-) Wieso muss das so dermaßen verschachtelt sein? Wieso ohne eigene Namen für die Elemente der Liste?
die werte sind eine konfiguration für eine abtastmethode, die auf eine liste mit zahlenwerte angewand wird. die klasse liefert dann die abgetasteten werte zurück. die klasse für diese abtastung besteht eben bereits, und da möcht ich nicht so gerne was dran ändern, da die alles andere als trivial ist :-)

Verfasst: Montag 19. Oktober 2009, 15:57
von cofi
Unittests :!: :roll: