简体   繁体   中英

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

I'm having an issue and I have no idea why this is happening and how to fix it. I'm working on developing a Videogame with python and pygame and I'm getting this error:

 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__'

The code:

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]

Can you explain to me what that error means and why it is happening so I can fix it?

BrenBarn is correct. The error means you tried to do something like None[5] . In the backtrace, it says self.imageDef=self.values[2] , which means that your self.values is None .

You should go through all the functions that update self.values and make sure you account for all the corner cases.

move.CompleteMove() does not return a value (perhaps it just prints something). Any method that does not return a value returns None , and you have assigned None to self.values .

Here is an example of this:

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

You'll note y doesn't print anything, because its None (the only value that doesn't print anything on the interactive prompt).

The function move.CompleteMove(events) that you use within your class probably doesn't contain a return statement. So nothing is returned to self.values (==> None). Use return in move.CompleteMove(events) to return whatever you want to store in self.values and it should work. Hope this helps.

Im also facing same issue with the following code:

在此处输入图像描述

def get_event_content(self, event_name):
    """
    Get content metadata blob
    :return:
    """
    info = self.webservice.get_content_portal_item_by_name(event_name)["json_result"]["results"]
    content = None
    if len(info) > 0:
        content = info[0]
    return content

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM