Подтвердить что ты не робот

TypeError: объект "NoneType" не имеет атрибута "__getitem__"

У меня проблема, и я понятия не имею, почему это происходит и как ее исправить. Я работаю над разработкой Videogame с python и pygame, и я получаю эту ошибку:

 File "/home/matt/Smoking-Games/sg-project00/project00/GameModel.py", line 15, in Update 
   self.imageDef=self.values[2]
TypeError: 'NoneType' object has no attribute '__getitem__'

Код:

import pygame,components
from pygame.locals import *

class Player(components.Entity):

    def __init__(self,images):
        components.Entity.__init__(self,images)
        self.values=[]

    def Update(self,events,background):
        move=components.MoveFunctions()
        self.values=move.CompleteMove(events)
        self.imageDef=self.values[2]
        self.isMoving=self.values[3]

    def Animation(self,time):
        if(self.isMoving and time==1):
            self.pos+=1
            if (self.pos>(len(self.anim[self.imageDef])-1)):
                self.pos=0
        self.image=self.anim[self.imageDef][self.pos]

Можете ли вы объяснить мне, что означает эта ошибка и почему это происходит, чтобы я мог ее исправить?

4b9b3361

Ответ 1

BrenBarn верен. Ошибка означает, что вы пытались сделать что-то вроде None[5]. В backtrace говорится self.imageDef=self.values[2], что означает, что ваш self.values равен None.

Вы должны пройти все функции, которые обновляют self.values, и убедитесь, что вы учитываете все угловые случаи.

Ответ 2

move.CompleteMove() не возвращает значение (возможно, оно просто печатает что-то). Любой метод, который не возвращает значение, возвращает None, и вы назначили None на self.values.

Вот пример:

>>> def hello(x):
...    print x*2
...
>>> hello('world')
worldworld
>>> y = hello('world')
worldworld
>>> y
>>>

Вы заметите, что y ничего не печатает, потому что его None (единственное значение, которое ничего не печатает в интерактивной подсказке).

Ответ 3

Функция move.CompleteMove(events), которую вы используете в своем классе, вероятно, не содержит оператора return. Поэтому ничего не возвращается self.values (== > None). Используйте return в move.CompleteMove(events), чтобы вернуть то, что вы хотите сохранить в self.values, и оно должно работать. Надеюсь, это поможет.