python 字典分支,避免大量if语句

基本方法

class main:

    def action_branch(self ,value):
        # 定义分支字典
        branch = {
            '1': self.action1,
            '2': self.action2,
            '3': self.action3
        }

        # 以传入参数匹配执行动作
        branch.get(value, self.default_action)()

    def action1(self):
        print("执行动作1")

    def action2(self):
        print("执行动作2")

    def action3(self):
        print("执行动作3")

    def default_action(self):
        print("执行默认动作")

if __name__ == "__main__":
    main().action_branch('1')

结合匿名函数 lambda 

基本方法一般来说,可以用,但是不好用,不知道大家有没有注意到,branch字典在内存中创建的时候会直接去获取到对应对象(可以理解为以上的action1、action2、action3),但是,如果branch字典在内存中创建的时候任意一个对象在当前时间点是不存在的,有可能只存在其中一个对象,其他所有对象都还不存在,那就会出问题。

所以我们需要一个中间人来传话,而匿名函数 lambda 就很适合当这个中间人的角色,这样branch字典在创建的时候就不是直接获取到目标对象,而是获取到了匿名函数 lambda 对象,而一个函数只有调用了,它里面的代码才会执行,这样我们就实现了延迟加载。

class main:

    def action_branch(self ,value):
        # 正确的写法:代码运行到这里时,branch并不是去获取text属性,而是获取到了三个lambda函数对象
        # 函数没有调用时,它内部的代码是不会执行的
        branch = {
            '1': lambda: self.action1(self.text1),
            '2': lambda: self.action1(self.text2),
            '3': lambda: self.action1(self.text3)
        }

        self.text1 = 'Hello World 1'
        self.text2 = 'Hello World 2'
        self.text3 = 'Hello World 3'

        branch.get(value, self.default_action)()

        # -----------------------------分隔线-----------------------------------

        # 错误的写法:代码运行到这里时,text属性并未创建,但是branch时却直接去获取了
        branch = {
            '1': [self.action1,self.text1],
            '2': [self.action1,self.text2],
            '3': [self.action1,self.text3]
        }

        self.text1 = 'Hello World 1'
        self.text2 = 'Hello World 2'
        self.text3 = 'Hello World 3'

        branch.get(value, self.default_action)[0]([1])


    def action1(self ,value):
        print("执行动作1")
        print(value)

    def default_action(self):
        print("执行默认动作")

if __name__ == "__main__":
    main().action_branch('1')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值