从edgedb的源码学习如何简化大量if...elif...else

本文介绍如何使用Python的functools装饰器`value_dispatch`,将if-elif-else的条件判断优雅地转化为注册函数的方式,提高代码可维护性和灵活性。通过实例展示如何为不同水果类型定义对应的行为。
摘要由CSDN通过智能技术生成

我们有一个变量s_fruit,需要根据其值来判断执行哪个逻辑,常规的写法就是if..elif...else的多重if语句,好一点就是把每个if给他提出去。

s_fruit = 'qqq'
if s_fruit == 'apple':
    print("I love apples!")
elif s_fruit in ['eggplant', 'squash']:
    print(f"I didn't know {s_fruit} is a fruit!")
else:
    print(f"I don't want a {s_fruit}...")

edge的源码里有一个装饰器,通过装饰器去分发给不同的分支。

源码如下:

import functools


def value_dispatch(func):

    registry = {}

    @functools.wraps(func)
    def wrapper(arg0, *args, **kwargs):
        try:
            delegate = registry[arg0]
        except KeyError:
            pass
        else:
            return delegate(arg0, *args, **kwargs)

        return func(arg0, *args, **kwargs)

    def register(value):
        def wrap(func):
            if value in registry:
                raise ValueError(
                    f'@value_dispatch: there is already a handler '
                    f'registered for {value!r}'
                )
            registry[value] = func
            return func

        return wrap

    def register_for_all(values):
        def wrap(func):
            for value in values:
                if value in registry:
                    raise ValueError(
                        f'@value_dispatch: there is already a handler '
                        f'registered for {value!r}'
                    )
                registry[value] = func
            return func

        return wrap

    wrapper.register = register
    wrapper.register_for_all = register_for_all
    return wrapper

使用装饰器来完成我们if语句的功能:

@value_dispatch
def eat(fruit):
    return f"I don't want a {fruit}..."


@eat.register('apple')
def _eat_apple(fruit):
    return "I love apples!"


@eat.register('eggplant')
@eat.register('squash')
def _eat_what(fruit):
    return f"I didn't know {fruit} is a fruit!"


print(eat('qqq'))

有其他的需求,可以自行改造源码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值