python - 使用装饰器参数进行切换
问题描述
在 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!!!!
增强
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!
推荐阅读
- mysql - 如何在 WHERE 子句已编入索引的情况下加速这个 MySQL 查询?
- html - 如何使用自动换行属性限制元素的宽度?
- reactjs - 反应道具类型验证错误
- javascript - TabIndex 不适用于 RadWindow 中的输入元素
- mysql - NOT IN key word not working following mysql query ?
- mysql - 由于编码使用不当而导致数据保护受损?
- python-3.x - PySpark parquet 数据类型
- google-api - 通过 API 获取所有委托联系人
- sql - SQL Query Help - Negative reporting
- maple - why map on list generates extra []