python - 使用装饰器参数进行切换

标签 python decorator

在 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!

我很长时间都在努力弄清楚这个问题,但我无法做到。你觉得不可能吗?

最佳答案

这是一个相对简单的方法(尽管我建议您在最后更改 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!!!!

增强

您可以支持使用默认情况,例如 C/C++ 的 switch 语句支持,当没有匹配的 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!

关于python - 使用装饰器参数进行切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53445074/

相关文章:

python - 写出类中的完整输入列表以进行模型预测

python - 如何更改 scrapy spider 中的 User_AGENT?

python - 多个 python 装饰器

python - 如何将装饰器应用到每个 Flask View

python - 这是 Python 中某种类型的装饰器吗?

python - 方法后 Tkinter 的内部工作

python - 将 WTForms 提交按钮设置为图标

python - scipy.optimize 有令人困惑的行为

python - 向类添加装饰函数

使用 Django 的 Ajax View