1.frozenset函数
1.1 frozenset函数的介绍
在 Python 中,frozenset() 函数是一个重要的工具,用于创建不可变的集合对象
参考下面
https://blog.csdn.net/zq4601551/article/details/136851335
1.2 frozenset函数的应用
-
列表,字典等可变对象是为不可哈希的,如果将不可哈希对象当成字典的键和集合的元素就会报错: TypeError: unhashable type: ‘dict’。
-
frozenset
是 Python 中的一种数据类型,它是一种不可变的集合,即集合中的元素不可变化。因此,frozenset
对象是可哈希的,可以作为字典的键或集合的元素。 -
可以使用
frozenset
来包装一个字典的视图对象(不可hash),从而得到一个不可变的、可哈希的版本。例如:
test_dic = {'a': 1, 'b': 2, 'c': 3}
# dic = {test_dic: 1}
# 输出: TypeError: unhashable type: 'dict',
dic = {frozenset(test_dic.items()): 1}
print(dic)
#输出 {frozenset({('a', 1), ('b', 2), ('c', 3)}): 1}
# 这样就能把字典信息当成另一个字典的key,对于列表对象也是一样的道理
1.3 frozenset函数的进阶应用
事件驱动的一种应用,结合装饰器使用,可以根据接收到字典信息,然后执行对应函数
events = {}
def register(event_name: dict): # 函数注册装饰器 将函数注册到字典events里面
def decorator(func):
events[frozenset(event_name.items())] = func
return decorator
def trigger(event_name: dict): # 触发函数,获取需要执行的函数在events里面对应的key
"""根据驱动事件信息找出最符合的函数对象
"""
funcs = []
for event in events.keys():
if all(item in frozenset(event_name.items()) for item in event):
funcs.append(event)
if funcs:
return [max(funcs, key=len)]
return []
@register({"event": "click"}) #注册函数func1到events字典里面
def func1():
print('执行click方法')
@register({"event": "input"}) #注册函数func2到events字典里面
def func2():
print('执行input方法')
@register({"event": "click", "event_2": 'input'}) #注册函数func3到events字典里面
def func3():
print('先执行click方法,然后输入input方法')
def run(events_data):
func_arr = trigger(events_data)
if func_arr:
for func in func_arr:
events[func]()
else:
print('未找到对应事件对应的驱动')
if __name__ == '__main__':
print(events) # {frozenset({('event', 'click')}): <function func1 at 0x000001B221AFF318>, frozenset({('event', 'input')}): <function func2 at 0x000001B221AFF0D8>, frozenset({('event', 'click'), ('event_2', 'input')}): <function func3 at 0x000001B221AFF048>}
run(events_data={"event": "click", 'other_key': "other_info"}) # 输出:执行click方法
run(events_data={"event": "click", "event_2": 'input', 'other_key': "other_info"}) # 先执行click方法,然后输入input方法
run(events_data={'other_key': "other_info"}) # 未找到对应事件对应的驱动