示例:打标签
为了对网站上的内容进行分类标识,很多网站都提供了打标签(tagging)功能:
比如论坛可能会允许用户为帖子添加标签,这些标签既可以对帖子进行归类,又可以让其他用户快速地了解到帖子要讲述的内容;
又比如说,一个图书分类网站可能会允许用户为自己收藏的每一本书添加标签,使得用户可以快速地找到被添加了某个标签的所有图书,并且网站还可以根据用户的这些标签进行数据分析,从而帮助用户找到他们可能会感兴趣的图书;
除此之外,购物网站也可以为自己的商品加上标签,比如“新上架”、“热销中”、“原装进口”等等,方便顾客了解每件商品的不同特点和属性;
类似的例子还有很多很多。
代码清单 5-2 展示了一个使用集合实现的打标签程序,通过这个程序,我们可以为不同的对象添加任意多个标签:同一个对象的所有标签都会被放到同一个集合里面,集合里的每一个元素就是一个标签。
代码清单 5-2 使用集合实现的打标签程序:/set/tagging.py
- def make_tag_key(item):
- return item + "::tags"
- class Tagging:
- def __init__(self, client, item):
- self.client = client
- self.key = make_tag_key(item)
- def add(self, *tags):
- """
- 为对象添加一个或多个标签。
- """
- self.client.sadd(self.key, *tags)
- def remove(self, *tags):
- """
- 移除对象的一个或多个标签。
- """
- self.client.srem(self.key, *tags)
- def is_included(self, tag):
- """
- 检查对象是否带有给定的标签,
- 是的话返回 True ,不是的话返回 False 。
- """
- return self.client.sismember(self.key, tag)
- def get_all_tags(self):
- """
- 返回对象带有的所有标签。
- """
- return self.client.smembers(self.key)
- def count(self):
- """
- 返回对象带有的标签数量。
- """
- return self.client.scard(self.key)
以下代码展示了如何使用这个打标签程序去为《The C Programming Language》这本书添加标签:
- >>> from redis import Redis
- >>> from tagging import Tagging
- >>> client = Redis(decode_responses=True)
- >>> book_tags = Tagging(client, "The C Programming Language")
- >>> book_tags.add('c') # 添加标签
- >>> book_tags.add('programming')
- >>> book_tags.add('programming language')
- >>> book_tags.get_all_tags() # 查看所有标签
- set(['c', 'programming', 'programming language'])
- >>> book_tags.count() # 查看标签的数量
- 3
作为例子,图 5-7 展示了一些使用打标签程序创建出的集合数据结构。
图 5-7 使用打标签程序创建出的集合