TypeError: 'int' object has no attribute '__getitem__'

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
k.A.
User
Beiträge: 2
Registriert: Sonntag 2. Dezember 2012, 00:09

Hallo,

ich baue an einer Raffstore Steuerung und habe dazu folgendes Testskript geschrieben.

Code: Alles auswählen

#!/usr/bin/python

import sys
import smbus


bus = smbus.SMBus(1)

# chip adressen
chip_rauf       = (0x20)
chip_runter     = (0x00)

kueche          = [18,1]  # GPA0
esszimmer1      = [18,2]  # GPA1

bus.write_byte_data(0x20,0x00,0x00) # Set all of bank A to outputs
bus.write_byte_data(0x20,0x01,0x00) # Set all of bank B to outputs

list = []

def main():
    global list
    list = kueche
    runlist(chip_rauf)
    sys.exit()
    
def runlist(chip):
    for i in list:
        bus.write_byte_data(chip, i[0], i[1])

if __name__ == '__main__':
    main()

Beim Aufruf bekomme ich den Fehler:

pi@raspberrypi ~/work/python $ ./test.py
Traceback (most recent call last):
File "./test.py", line 32, in <module>
main()
File "./test.py", line 24, in main
runlist(chip_rauf)
File "./test.py", line 29, in runlist
bus.write_byte_data(chip, i[0], i[1])
TypeError: 'int' object has no attribute '__getitem__'

Wenn ich
>>> bus.write_byte_data(0x20, list[0], list[1])
ohne der for Schleife aufrufe funktioniert alles...

woran liegt das
Danke im Voraus
Zuletzt geändert von Anonymous am Sonntag 2. Dezember 2012, 09:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

kuche ist eine Liste von 2 Integern. Die haben keinen Index, auf den du mit [] zugreifen kannst.

Der Programmstil ist sehr unsauber, dann passiert so etwas.
Verzichte auf globale Variabeln und benutzte in Funktionen nur die, die per Parameter übergeben werden.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oder nochmal anders erklärt: In deinem zweiten Beispiel greifst du direkt auf die Listenelemente an Stelle 0 und an Stelle 1 zu - dies funktioniert auch entsprechend, da deine beiden Listen ja 2 Elemente haben. Bei dem Beispiel mit der Schleife wiederum durchläufst du die Liste, indem du jedes Element jeweils an `i` bindest. Von diesem `i`, was ja schon ein Integer ist, versuchst du nochmals an Index 0 und 1 zu kommen. Dies wirft dann den Fehler, da Integer (also Zahlen) in Python aus naheliegenden Gründen keinen Index haben.
k.A.
User
Beiträge: 2
Registriert: Sonntag 2. Dezember 2012, 00:09

danke für die Hinwiese.

mit einer [ ] um die kueche funktionierts.
Damit werden die beiden Integers ebenfalls als Liste übergeben und sind über den Index erreichbar, denke ich...

Code: Alles auswählen

list = []

def main():
    global list
    list = [kueche]
    runlist(chip_rauf)
    sys.exit()
   
def runlist(chip):
    for i in list:
        bus.write_byte_data(chip, i[0], i[1])

if __name__ == '__main__':
    main()


natürlich genauso mit der saubereren Variante mit den Funktionsparametern.

Code: Alles auswählen

def main():
    rlist = [kueche]
    runlist(chip_rauf, rlist)
    sys.exit()
   
def runlist(chip, rlist):
    for i in rlist:
        bus.write_byte_data(chip, i[0], i[1])

if __name__ == '__main__':
    main()
danke
BlackJack

@k.A.: Das funktioniert zwar, aber es macht keinen Sinn das Programm beziehungsweise die Datenstruktur an der Stelle durch eine zusätzliche und eigentlich unnötige Liste komplexer zu machen. Du könntest auch einfach die unsinnige Schleife weg lassen.
Antworten