首页 > 编程语言 >python中 一种有趣的关于事件驱动和发布订阅的逻辑整理

python中 一种有趣的关于事件驱动和发布订阅的逻辑整理

时间:2024-05-24 16:26:08浏览次数:29  
标签:订阅 name python self 事件驱动 func var event def

文章目录

1. 形式一:使用if else,判断不同情况

def func(var):
    if var == "a":
        print("执行情况a")
    elif var == "b":
        print("执行情况b")
    elif var == "c":
        print("执行行情况c")
    elif var == "d":
        print("执行行情况d")

func(var="a")
func(var="b")
func(var="c")
func(var="d")

2.形式二:封装方法,将方法放到字典里面判断不同情况

这种方法易于理解,但它有一个缺点,即字典的键必须是可哈希的,因此不能使用像列表或字典这样的变量作为事件消息。

def func_var_a():
    print("执行情况a")


def func_var_b():
    print("执行情况b")


def func_var_c():
    print("执行情况c")


def func_var_d():
    print("执行情况d")


event = {"a": func_var_a, "b": func_var_b, "c": func_var_c, "d": func_var_d}


def trigger(var):
    event[var]()


trigger(var='a')
trigger(var='b')
trigger(var='c')
trigger(var='d')

3.形式三:利用装饰器,模拟事件驱动的情况

相较于第二种形式,使用了装饰器,虽然增加了代码复杂性,但我认为这样做更有利于开发人员整理逻辑。然而,与第二种方法相同,它也无法处理像列表或字典这样的变量作为事件消息。

class EventDispatcher:

    def __init__(self):
        self._events = {}

    def register_event(self, var):
        def decorator(func):
            self._events[var] = func

        return decorator

    def run(self, var):
        self._events[var]()


eventdispatcher = EventDispatcher()


@eventdispatcher.register_event("a")
def func_var_a():
    print("执行情况a")


@eventdispatcher.register_event("b")
def func_var_b():
    print("执行情况b")


@eventdispatcher.register_event("c")
def func_var_c():
    print("执行情况c")


@eventdispatcher.register_event("d")
def func_var_d():
    print("执行情况d")


if __name__ == '__main__':
    eventdispatcher.run(var='a')
    eventdispatcher.run(var='b')
    eventdispatcher.run(var='c')
    eventdispatcher.run(var='d')

4.形式四:基于形式三的一种优化 - 仅会执行最匹配事件消息的驱动方法

通过使用内置函数frozenset,可以将可变集合转换为可哈希的对象,从而克服了无法使用列表或字典等变量作为事件消息的限制。这种方法仅会执行最匹配事件消息的驱动方法。

class EventDispatcher:

    def __init__(self):
        self._event = {}

    def register_event(self, event_name):
        def wrapper(func):
            self._event[frozenset(event_name.items())] = func

        return wrapper

    def trigger_event(self, event_name):
        func_arr = []

        for subscription_key in self._event.keys():
            if all(sub_key in frozenset(event_name.items()) for sub_key in subscription_key):
                func_arr.append(subscription_key)
        if len(func_arr):
            return [max(func_arr, key=len)]
        return []
        # return func_arr

    def run(self, event_name, *args, **kwargs):
        func = self.trigger_event(event_name=event_name)
        for f in func:
            self._event[f](*args, **kwargs)


eventdispatcher = EventDispatcher()


@eventdispatcher.register_event({"var_1": "a", "var_2": "b", "var_3": "c"})
def func_var_1():
    print("执行情况a,b,c")


@eventdispatcher.register_event({"var_1": "a", "var_2": "b"})
def func_var_2():
    print("执行情况a,b")


@eventdispatcher.register_event({"var_1": "a"})
def func_var_2():
    print("执行情况a")


if __name__ == '__main__':
    eventdispatcher.run(event_name={"var_1": "a", "other_key": "other_infos"})
    eventdispatcher.run(event_name={"var_1": "a", "var_2": "b", "other_key": "other_infos"})
    eventdispatcher.run(event_name={"var_1": "a", "var_2": "b", "var_3": "c", "other_key": "other_infos"})

5.形式四:基于形式四的一种变化 - 类似于消息的订阅和发布(匹配的订阅方法都会执行,而不是仅执行匹配度最高的方法。)

这个方法会在发布的消息中寻找匹配的订阅方法并执行,而不是仅执行匹配度最高的方法。

class EventDispatcher:

    def __init__(self):
        self._event = {}

    def register_event(self, event_name):
        def wrapper(func):
            self._event[frozenset(event_name.items())] = func

        return wrapper

    def trigger_event(self, event_name):
        func_arr = []

        for subscription_key in self._event.keys():
            if all(sub_key in frozenset(event_name.items()) for sub_key in subscription_key):
                func_arr.append(subscription_key)
        # if len(func_arr):
        #     return [max(func_arr, key=len)]
        # return []
        return func_arr

    def run(self, event_name, *args, **kwargs):
        func = self.trigger_event(event_name=event_name)
        for f in func:
            self._event[f](*args, **kwargs)


eventdispatcher = EventDispatcher()


@eventdispatcher.register_event({"var_1": "a", "var_2": "b", "var_3": "c"})
def func_var_1():
    print("执行情况a,b,c")


@eventdispatcher.register_event({"var_1": "a", "var_2": "b"})
def func_var_2():
    print("执行情况a,b")


@eventdispatcher.register_event({"var_1": "a"})
def func_var_2():
    print("执行情况a")


if __name__ == '__main__':
    eventdispatcher.run(event_name={"var_1": "a", "var_2": "b", "var_3": "c", "other_key": "other_infos"})

标签:订阅,name,python,self,事件驱动,func,var,event,def
From: https://blog.csdn.net/qq_29371275/article/details/139124049

相关文章

  • 使用python uiautomation模块,结合多线程快速寻找控件
    文章目录1.形式一2.形式二1.形式一该方法使用多线程进行搜索,主线程不会等待所有子线程返回结果后再继续执行,而是在获取队列中第一个结果后立即继续执行。优势在于一旦有子线程找到结果,主线程就能立即继续执行;劣势在于未找到结果的子线程会持续搜索,直到达到设定的最大......
  • SQLServer通过发布订阅实现主从同步(读写分离)
    发布订阅实操:(1).启动SQLServer代理模式。 PS:从库也可以不用创建,因为在新建订阅的时候,可以选择自动创建,会自动同步数据库结构。 1.配置分发服务器(1). 如果是首次配置读写分离,需要配置分发服务器,后续不再配置。 如果不想用之前的分发服务器,可以右键复制,禁用分发服务器......
  • 【Python数据分析】统计学 四分位距
    四分位距四分位距(interquartilerange,IQR)是描述统计学中的一种方法,,以确定第三四分位数和第一四分位数的差(即......
  • 软件测试-Python基础(2)
    一、内容介绍这期主要学习:循环、字符串、列表。目录如下:二、思维导图三、循环 3.1for循环3.2 continue和break   【结果】 【结果】  3.3if-esle应用用户登录系统  【结果】 3.4循环-偶数和四、字符串4.1下标(索引)4.2切片切片(slic......
  • 将八个老师随机分配到三个办公室---使用python代码实现
    具体思路:1首先要先定义一个变量teacher_name存储八个老师的姓名2其次循环遍历老师姓名,并定义随机数字0-2,表示三个办公室。将这八个老师的名字随机分配到0-2中。3最后再通过for循环遍历打印出各个office的老师名字。importrandomteacher_name=['lisa','jiker','rose......
  • python对字符串的操作
    #coding=utf-8"""对字符串的操作"""#1、strip()去除字符串中首尾存在的0或空格string="000wyl000"print(string.strip('0'))#执行结果:wyl#2、find()和index()查找字符串中指定内容,如果找到返回其索引值,如果未找到,则返回-1string="123wyl000"print(string.fin......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-47-自动滚动到元素出现的位置
    1.简介在我们日常工作中或者生活中,经常会遇到我们的页面内容较多,一个屏幕范围无法完整展示内容,我们就需要滚动滚动条去到我们想要的地方,如下图页面,我们虽然在豆瓣首页,但是内容并不完整,如果我们想要直接点击电影模块中的选电影按钮,是需要往下滑动的。当页面超过屏幕的高度时候,需要......
  • python 离线按照PyQt5
    首先外网下载所需要的安装包1.新建虚拟环境python-mvenvQtTest2.安装PyQt5和PyQt5-tools这两个库pipinstallpyQt5-tool-ihttps://mirrors.aliyun.com/pypi/simple/pipinstallPyQt5-tool-ihttps://mirrors.aliyun.com/pypi/simple/3.导出requirements.txt这个文......
  • 【Python】数据分析 Section 6.4: Heatmaps | from Coursera “Applied Data Science
    Heatmapsareawaytovisualizethree-dimensionsofdataandtotakeadvantageofspatialproximityofthosedimensions.InmakingrevisionstothiscourseIwasreallytemptedtogetridofthesectiononheatmaps,asI'veseenenoughbadheatmapst......
  • Python-Turtle.一箭穿心
            一箭穿心图是一种简单的图形,通常由一个箭头穿过一个心形组成。在Python中,可以使用turtle库来绘制这样的图形。首先,导入turtle库,然后使用turtle库的函数来绘制箭头和心形,最后将箭头和心形组合在一起即可实现一箭穿心图画。        以下是一个简单的Pyt......