首页 > 解决方案 > 使用装饰器参数进行切换

问题描述

在 flaks 库中,我们可以使用类似 switch case 的装饰器。(我明白了吗?)

app.route('')

所以...我想用装饰器和参数做一些 switch 语句,

像:

@color('pink')
def _pink_power(self):
    print("wow")

@color('blue')
@color('red')
def _powerpower(self):
    print("god!!!!")

def input(color):
    I don't know what to do in here..
    if color is pink, print wow!

我挣扎了很长时间才弄清楚这一点,但我无法做到。你觉得不可能吗?

标签: pythondecorator

解决方案


这是一种相对简单的方法(尽管我建议您input在最后更改函数的名称,因为它与同名的内置函数冲突):

class color:
    _func_map = {}

    def __init__(self, case):
        self.case = case

    def __call__(self, f):
        self._func_map[self.case] = f
        return f

    @classmethod
    def switch(cls, case):
        cls._func_map[case]()


@color('pink')
def _pink_power():
    print("wow")

@color('blue')
@color('red')
def _powerpower():
    print("god!!!!")


def input(colorname):
    color.switch(colorname)

input('pink') # -> wow
input('blue') # -> god!!!!
input('red')  # -> god!!!!

增强

switch您可以支持在没有匹配项时使用默认情况,例如 C/C++ 的语句支持colorname

class color:
    DEFAULT = '_DEFAULT'
    _func_map = {}

    def __init__(self, case):
        self.case = case

    def __call__(self, f):
        self._func_map[self.case] = f
        return f

    @classmethod
    def _default(cls):
        raise ValueError('Unknown color!')

    @classmethod
    def switch(cls, case):
        cls._func_map.get(case, cls._default)()

添加到类的_default()方法在调用时会引发异常:

input('lavender')  # -> ValueError: Unknown color!

但是,您可以通过定义自己的错误处理函数来覆盖它:

@color(color.DEFAULT)  # Override default function.
def my_default():
    print("loser!")

input('lavender')  # -> loser!

推荐阅读