使用装饰器实现重复功能的Pythonic方法

时间:2017-03-22 19:33:33

标签: python

@mydecorator('foo')
def foo():
    logic('foo')
    return True

@mydecorator('bar')
def bar():
    logic('bar')
    return True

@mydecorator('lorem')
def lorem():
    logic('lorem')
    return True

@mydecorator('ipsum')
def ipsum():
    logic('ipsum')
    return True

@mydecorator('abc')
def abc():
    logic('abc')
    return True

@mydecorator('xyz')
def xyz():
    logic('xyz')
    return True

注意模式和重复性? 假设我有一个列表['foo','bar','lorem','ipsum','abc','xyz'],如何以较少重复的方式实现与上述代码片段相同的效果?

我从数据库中获取此列表,我需要灵活地添加/删除此列表中的更多项目并实现相应的效果。

注意:我在几个框架/架构限制范围内运行,所以是的,"如果你不得不这样做,那就是糟糕的架构",但这就是我需要去做。我想知道它是否可能。

2 个答案:

答案 0 :(得分:0)

我不知道你的mydecoratorlogic中有什么,但我的方法可以转移到它。这是一种更加“pythonic”的方式来做你想做的事情:

from functools import wraps

def mydecorator(func):
    @wraps(func)
    def decorated(*args, **kwargs):
        print("In mydecorator: called by: "+func.__name__)
        return func(func.__name__, *args, **kwargs)
    return decorated

@mydecorator
def foo(name):
    logic(name)
    return True

@mydecorator
def bar(name):
    logic(name)
    return True

@mydecorator
def lorem(name):
    logic(name)
    return True

@mydecorator
def ipsum(name):
    logic(name)
    return True


def logic(name):
    print("In logic: called by: "+name)

答案 1 :(得分:0)

一种方法是使用嵌套def来创建闭包,从而将公共代码分解出来。然后,使用 map()将函数应用于各种固定参数:

def make_decorated(s):
    def inner():
        logic(s)
        return True
    return mydecorator(s)(inner)

foo, bar, lorem, ipsum = map(make_decorated, ['foo', 'bar', 'lorem', 'ipsum'])