python中 一种函数式编程方式的整理

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"})

6.形式六:基于形式五的一种变化 - 将方法划分为类,从而使系统逻辑模块化

  • 方法最好封装为不需要参数的类型,因为多一个参数,就理解成本的上升
  • 方法命名规则最好包含三要素:动作,对象,位置(地点),change_display_mode_in_settings
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()


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


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


class ModelC:
    @staticmethod
    @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"})
  • 21
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值