Seite 1 von 1

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

Verfasst: Sonntag 2. Dezember 2012, 00:25
von k.A.
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

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

Verfasst: Sonntag 2. Dezember 2012, 00:40
von sparrow
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.

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

Verfasst: Sonntag 2. Dezember 2012, 13:21
von snafu
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.

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

Verfasst: Sonntag 2. Dezember 2012, 14:00
von k.A.
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

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

Verfasst: Sonntag 2. Dezember 2012, 16:25
von 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.