如何使用一种方法通过某个值更新一个对象的不同集合?

时间:2018-01-16 16:09:03

标签: python python-3.x algorithm

我有两个相同的方法可以通过某个值更新列表:

 def block_device(self, device_id):
    if self.block_device_ids is None:
        self.block_device_ids = []
    if device_id not in self.block_device_ids:
        self.block_device_ids.append(device_id)
        self.save()
        return True
    return False

 def add_video(self, video_id):
    if self.video_ids is None:
        self.video_ids = []
    if video_id not in self.video_ids:
        self.video_ids.append(video_id)
        self.save()
        return True
    return False

如何创建一个方法update_collection并在两种情况下都使用它?

我创建了以下解决方案:

async def update_collection(self, collection, item, attr_name):
    if collection is None:
        collection = []
    if item not in collection:
        getattr(self, attr_name).append(item)
        await self.save()
        return True
    return False

 async def add_video(self, video_id):
    return await self.update_collection(self.video_ids, video_id, 'video_ids')

 async def block_device(self, device_id):
    return await self.update_collection(self.block_device_ids, device_id, 'device_ids')

但由于collection = [],它无法正常工作。如何解决这个问题? 有什么我可以改进的吗?

1 个答案:

答案 0 :(得分:1)

您不需要传递集合属性的名称:

async def update_collection(self, item, attr_name):
    collection = getattr(self, attr_name)
    if collection is None:
        setattr(self, attr_name, [])
        collection = getattr(self, attr_name)
    if item not in collection:
        collection.append(item)
        await self.save()
        return True
    return False

注意:您的代码的最后一行有一个错误:传入的attr_name应为" block_device_ids"不是" device_ids"