示例:打标签

为了对网站上的内容进行分类标识,很多网站都提供了打标签(tagging)功能:

  • 比如论坛可能会允许用户为帖子添加标签,这些标签既可以对帖子进行归类,又可以让其他用户快速地了解到帖子要讲述的内容;

  • 又比如说,一个图书分类网站可能会允许用户为自己收藏的每一本书添加标签,使得用户可以快速地找到被添加了某个标签的所有图书,并且网站还可以根据用户的这些标签进行数据分析,从而帮助用户找到他们可能会感兴趣的图书;

  • 除此之外,购物网站也可以为自己的商品加上标签,比如“新上架”、“热销中”、“原装进口”等等,方便顾客了解每件商品的不同特点和属性;

类似的例子还有很多很多。

代码清单 5-2 展示了一个使用集合实现的打标签程序,通过这个程序,我们可以为不同的对象添加任意多个标签:同一个对象的所有标签都会被放到同一个集合里面,集合里的每一个元素就是一个标签。


代码清单 5-2 使用集合实现的打标签程序:/set/tagging.py

  1. def make_tag_key(item):
  2. return item + "::tags"
  3.  
  4. class Tagging:
  5.  
  6. def __init__(self, client, item):
  7. self.client = client
  8. self.key = make_tag_key(item)
  9.  
  10. def add(self, *tags):
  11. """
  12. 为对象添加一个或多个标签。
  13. """
  14. self.client.sadd(self.key, *tags)
  15.  
  16. def remove(self, *tags):
  17. """
  18. 移除对象的一个或多个标签。
  19. """
  20. self.client.srem(self.key, *tags)
  21.  
  22. def is_included(self, tag):
  23. """
  24. 检查对象是否带有给定的标签,
  25. 是的话返回 True ,不是的话返回 False 。
  26. """
  27. return self.client.sismember(self.key, tag)
  28.  
  29. def get_all_tags(self):
  30. """
  31. 返回对象带有的所有标签。
  32. """
  33. return self.client.smembers(self.key)
  34.  
  35. def count(self):
  36. """
  37. 返回对象带有的标签数量。
  38. """
  39. return self.client.scard(self.key)

以下代码展示了如何使用这个打标签程序去为《The C Programming Language》这本书添加标签:

  1. >>> from redis import Redis
  2. >>> from tagging import Tagging
  3. >>> client = Redis(decode_responses=True)
  4. >>> book_tags = Tagging(client, "The C Programming Language")
  5. >>> book_tags.add('c') # 添加标签
  6. >>> book_tags.add('programming')
  7. >>> book_tags.add('programming language')
  8. >>> book_tags.get_all_tags() # 查看所有标签
  9. set(['c', 'programming', 'programming language'])
  10. >>> book_tags.count() # 查看标签的数量
  11. 3

作为例子,图 5-7 展示了一些使用打标签程序创建出的集合数据结构。


图 5-7 使用打标签程序创建出的集合_images/IMAGE_TAGS_1.png

_images/IMAGE_TAGS_2.png

_images/IMAGE_TAGS_3.png