"list indices must be integers or slices not float" Ursache lokalisieren

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.
n00b@r00t
User
Beiträge: 10
Registriert: Dienstag 6. November 2018, 11:33

durch welches Kommando wird denn die variable als index definiert?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

liste[zahl_die_eine_ganzzahl_sein_sollte_aber_es_nicht_ist].

Das Problem ist, dass die betreffende Codestelle so nicht auffindbar ist. Dazu muss man

- die software zum laufen bringen (hast du. wir nicht).
- die stelle finden, an der das logging des fehlers stattfindet, und dieses logging entfernen, und stattdessen den vollen Fehler bekommen.

Dann siehst du, wo genau das passiert.
n00b@r00t
User
Beiträge: 10
Registriert: Dienstag 6. November 2018, 11:33

ok, ich habe hier mal die Schlüsselstellen rausgesucht

Code: Alles auswählen

  def get_price_offset(self, index):
            start_position = self.current_bid_price
            return start_position + index
            
           .....
   
    def prepare_order(self, index):
        """Create an order object."""

        quantity = 100

        price = self.get_price_offset(index)

        return {'price': price, 'orderQty': quantity, 'side': "Buy" if index < 0 else "Sell"}
           
Das ist wohl soweit alles wo dieser Index erwähnt ist, wie kann ich das jetzt abändern, damit ich da Brüche verwenden kann?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Stelle, die Du hier zeigst, hat nirgends eine Einschränkung, ob man da nun Brüche (Dezimal) oder Fließkommazahlen verwendet. Wie schon geschrieben, Du mußt die Stelle des Fehlers finden, und von dort aus Rückwärts suchen, wo ein "falscher" Wert eingesteuert wird.
n00b@r00t
User
Beiträge: 10
Registriert: Dienstag 6. November 2018, 11:33

Aber wird hier nicht die Zahl an Index definiert??? def get_price_offset(self, index):
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@n00b@r00t: Das die Variable hier `index` heisst ist nicht das Problem. Du musst die Stelle finden wo der Wert als Index *verwendet* wird, wobei an der Stelle die Variablen auch anders heissen kann. Der Name ist für Dich als Leser ein Hinweis, dem Rechner ist es egal wie Indexvariablen heissen. Der schaut halt nur bei einem Indexzugriff bei einer Liste ob es sich beim Wert um eine ganze Zahl, ein `slice`-Objekt, oder ein Wert von einem Typ handelt der `__index__()` implementiert hat.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
n00b@r00t
User
Beiträge: 10
Registriert: Dienstag 6. November 2018, 11:33

Leider habe ich keine Ahnung wie ich identifizieren soll soll wo ein Index verwendet wird und wo nicht...

also der Ursprung des Fehlers liegt sicher hier, weil wenn ich eine ganze Zahl verwende läuft es:

Code: Alles auswählen

        while buys_matched < len(buy_orders):
            to_create.append(buy_orders[buys_matched])
            self.postedOrders.append(buy_orders[buys_matched])
            buys_matched += 0.5
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

An der Stelle wurde ja nur auf komplizierte Weise ein

Code: Alles auswählen

to_create.extend(buy_orders)
self.postedOrders.extend(buy_orders)
geschrieben. Das hat ja noch nichts damit zu tun, was in der Liste `buy_orders` drinsteht. Eine halbe Kaufoption kann man halt nicht absetzen.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

buy_orders ist eine Liste. Und buys_matched ist eine Laufvariable, welche die einzelnen Indizes annimmt, mit dem man auf die Liste zugreifen kann. Wie bist du denn auf die Idee gekommen, dass du *DA* einfach irgendwo 0.5 draufaddieren kannst? Wenn ich drei Aepfel vor dir hinstelle und sage, "gib mir den ersten", dann weisst du was du tun musst. Wenn ich dir sage "gib mir den 1.5ten", dann guckst du mich bloed an. Das macht Python auch.

So leid es mir tut, du wirst nicht darum herumkommen, zu VERSTEHEN, wie Python funktioniert, und wie dein Bot funktioniert. Nur dann kannst du da geziehlt eine Aenderung herbeifuehren. Oder bohrst du auch einfach mit ner Bohrmaschine ein Loch irgendwo in deinen Motorblock, um dein Auto zu tunen? Da knirscht und knallt es dann auch.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@n00b@r00t: Wo `buys_matched` als Index verwendet wird ist eigentlich sehr offensichtlich, und warum das mit einem Dezimalbruch nicht klappt, sollte eigentlich auch sonnenklar sein wenn man Python kann. Also nicht Python-Profi ist, sondern einfach mal ein Grundlagentutorial durchgearbeitet hat. Zum Beispiel das in der Python-Dokumentation.

Bei dem Code-Beispiel müsstest Du dann auch mal erklären was bei einem Dezimalbruch passieren soll anstelle einer Ausnahme. Das erscheint mir nämlich nicht sinnvoll. Und die Schleife sieht auch komisch aus. Wenn da statt 0.5 original 1 steht, dann ist das kein idiomatisches Python, denn dann würde man das ohne Indexwert mit einer ``for``-Schleife schreiben. Wie wird `buys_matched` denn initialisiert?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten