python frozenset函数的应用_事件驱动相关

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"})  # 未找到对应事件对应的驱动


  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值