示例:待办事项列表

现在很多人都会使用待办事项软件(也就是通常说的TODO软件)去管理他们的待办事项,这些软件通常会提供一些列表,用户可以将他们要做的事情记录在待办事项列表里面,并将已经完成的事项放入到已完成事项列表里面。比如图 4-25 就展示了一个使用待办事项软件记录日常生活事项的例子。


图 4-25 使用待办事项软件记录日常生活事项_images/IMAGE_TRELLO.png


代码清单 4-3 展示了一个使用列表实现的待办事项程序,这个程序的核心概念是使用两个列表来分别记录待办事项和已完成事项:

  • 当用户添加一个新的待办事项时,程序就把这个事项放入到待办事项列表中。

  • 当用户完成待办事项列表中的某个事项时,程序就把这个事项从待办事项列表中移除,并将它放入到已完成事项列表中。


代码清单 4-3 代码事项程序:/list/todo_list.py

  1. def make_todo_list_key(user_id):
  2. """
  3. 储存待办事项的列表。
  4. """
  5. return user_id + "::todo_list"
  6.  
  7. def make_done_list_key(user_id):
  8. """
  9. 储存已完成事项的列表。
  10. """
  11. return user_id + "::done_list"
  12.  
  13.  
  14. class TodoList:
  15.  
  16. def __init__(self, client, user_id):
  17. self.client = client
  18. self.user_id = user_id
  19. self.todo_list = make_todo_list_key(self.user_id)
  20. self.done_list = make_done_list_key(self.user_id)
  21.  
  22. def add(self, event):
  23. """
  24. 将指定事项添加到待办事项列表中。
  25. """
  26. self.client.lpush(self.todo_list, event)
  27.  
  28. def remove(self, event):
  29. """
  30. 从待办事项列表中移除指定的事项。
  31. """
  32. self.client.lrem(self.todo_list, 0, event)
  33.  
  34. def done(self, event):
  35. """
  36. 将待办事项列表中的指定事项移动到已完成事项列表,
  37. 以此来表示该事项已完成。
  38. """
  39. # 从待办事项列表中移除指定事项
  40. self.remove(event)
  41. # 并将它添加到已完成事项列表中
  42. self.client.lpush(self.done_list, event)
  43.  
  44. def show_todo_list(self):
  45. """
  46. 列出所有待办事项。
  47. """
  48. return self.client.lrange(self.todo_list, 0, -1)
  49.  
  50. def show_done_list(self):
  51. """
  52. 列出所有已完成事项。
  53. """
  54. return self.client.lrange(self.done_list, 0, -1)

done() 方法是 TodoList 程序的核心,它首先会使用 LREM 命令从代办事项列表中移除指定的事项,然后再将该事项添加到已完成事项列表中,使得该事项可以在代办事项列表中消失,转而出现在已完成列表中。

作为例子,我们可以通过执行以下代码,创建出一个 TODO 列表对象:

  1. >>> from redis import Redis
  2. >>> from todo_list import TodoList
  3. >>> client = Redis(decode_responses=True)
  4. >>> todo = TodoList(client, "peter's todo")

然后通过执行以下代码,往 TODO 列表里面加入待完成事项:

  1. >>> todo.add("go to sleep")
  2. >>> todo.add("finish homework")
  3. >>> todo.add("watch tv")
  4. >>> todo.add("have lunch")
  5. >>> todo.add("buy some milk")
  6. >>> todo.show_todo_list()
  7. ['buy some milk', 'have lunch', 'watch tv', 'finish homework', 'go to sleep']

当我们完成某件事情之后,我们可以把它从待完成事项列表移动到已完成事项列表:

  1. >>> todo.done("buy some milk")
  2. >>> todo.show_todo_list()
  3. ['have lunch', 'watch tv', 'finish homework', 'go to sleep']
  4. >>> todo.show_done_list()
  5. ['buy some milk']

最后,如果我们不再需要去做某件事情,那么可以把它从待完成列表里面移除:

  1. >>> todo.remove("watch tv")
  2. >>> todo.show_todo_list()
  3. ['have lunch', 'finish homework', 'go to sleep']