NoneType没有Append属性

3 投票
2 回答
3800 浏览
提问于 2025-04-15 21:20

我刚开始学Python,搞不懂为什么在我代码的某个地方,一个变量会变成None

class UsersInRoom(webapp.RequestHandler):
    def get(self):
        room_id = self.request.get("room_id")
        username = self.request.get("username")
        UserInRoom_entities = UserInRoom.gql("WHERE room = :1", room_id).get()
        if UserInRoom_entities:
            for user_in_room in UserInRoom_entities:
                if user_in_room.username == username:
                    user_in_room.put() # last_poll auto updates to now whenenever user_in_room is saved
        else:
            user_in_room = UserInRoom()
            user_in_room.username = username
            user_in_room.put()
            // error here, on line 160
            UserInRoom_entities = []
            UserInRoom_entities.append(user_in_room)

        # name is `user_at_room` intead of `user_in_room` to avoid confusion    
        usernames = [user_at_room.username for user_at_room in UserInRoom_entities]
        self.response.out.write(json.dumps(usernames))

出现的错误是:

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 507, in __call__
    handler.get(*groups)
  File "path\to\chat.py", line 160, in get
AttributeError: 'NoneType' object has no attribute 'append'

这是怎么回事呢?我在调用之前就把UserInRoom_entities = []设置好了。难道是其他地方的None吗?

更新:这段代码可以正常运行:

class UsersInRoom(webapp.RequestHandler):
    def get(self):
        room_id = self.request.get("room_id")
        username = self.request.get("username")
        UserInRoom_entities = UserInRoom.gql("WHERE room = :1", room_id).get()
        if UserInRoom_entities:
            for user_in_room in UserInRoom_entities:
                if user_in_room.name == username:
                    user_in_room.put() # last_modified auto updates to now whenenever user_in_room is saved
        else:
            user_in_room = UserInRoom(room=Key(room_id), name=username)
            user_in_room.put()

            UserInRoom_entities = []
            UserInRoom_entities.append(user_in_room)

        # name is `user_at_room` intead of `user_in_room` to avoid confusion    
        usernames = [user_at_room.name for user_at_room in UserInRoom_entities]
        self.response.out.write(json.dumps(usernames))

class ChatRoom(db.Model):
    name = db.StringProperty()
    last_modified = db.DateTimeProperty(auto_now=True)
    message_contents = db.StringListProperty()
    message_users = db.StringListProperty()

class UserInRoom(db.Model):
    room = db.ReferenceProperty(ChatRoom)
    name = db.StringProperty()
    last_modified = db.DateTimeProperty(auto_now=True)

2 个回答

0

为了确保不是你在引发异常,你可以这样做:

            UserInRoom_entities = []
            # raised? then your .append is missing otherwise something else is wrong
            UserInRoom_entities.append
            UserInRoom_entities.append(user_in_room)
3

因为我之前在问题下的评论里提到了这个答案,所以我就把它当作答案再说一遍,希望能获得一些声望积分:

请问这个 UserInRoom 实例有没有正确初始化呢?我对 GAE 的数据模型不太了解,但我可以想象,如果 UserInRoomRoom 之间有关系(假设有一个 Room 类),那么在使用 put() 方法保存这个实例的时候,room 属性应该是需要设置好的。

撰写回答