Funktionsaufruf

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.
Ned Nederlander
User
Beiträge: 13
Registriert: Montag 19. Oktober 2009, 13:39

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!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Wenn du etwas mehr Code zeigst, wäre das hilfreich.
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
Ned Nederlander
User
Beiträge: 13
Registriert: Montag 19. Oktober 2009, 13:39

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.
Zuletzt geändert von Ned Nederlander am Montag 19. Oktober 2009, 14:33, insgesamt 2-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Pack Deinen Code mal in die code-Tags bitte!
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Ned Nederlander
User
Beiträge: 13
Registriert: Montag 19. Oktober 2009, 13:39

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Ned Nederlander
User
Beiträge: 13
Registriert: Montag 19. Oktober 2009, 13:39

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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.
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.
Ned Nederlander
User
Beiträge: 13
Registriert: Montag 19. Oktober 2009, 13:39

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?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nur mal so geraten:

Code: Alles auswählen

for element in my_list:
    at2 = AdaptiveTrigger(*element)
http://docs.python.org/tutorial/control ... ment-lists
Das Leben ist wie ein Tennisball.
Ned Nederlander
User
Beiträge: 13
Registriert: Montag 19. Oktober 2009, 13:39

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@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?
Ned Nederlander
User
Beiträge: 13
Registriert: Montag 19. Oktober 2009, 13:39

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 :-)
Zuletzt geändert von Ned Nederlander am Montag 19. Oktober 2009, 15:58, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Unittests :!: :roll:
Antworten