用decorator实现重复函数的Pythonic方法

用decorator实现重复函数的Pythonic方法,python,Python,注意模式和重复性? 假设我有一个列表['foo'、'bar'、'lorem'、'ipsum'、'abc'、'xyz'],如何以较少重复的方式实现与上述代码片段相同的效果 我从数据库中获得这个列表,我需要在这个列表中添加/删除更多项目的灵活性,并实现相应的效果 注意:我在几个框架/体系结构约束下运行,所以是的,“如果你不得不这样做,那就是糟糕的体系结构”,但这正是我需要做的。我不知道这是否可能。我不知道你的mydecorator或logic中有什么,但我的方法可以转移到它上。这是一种更“pytho

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

我从数据库中获得这个列表,我需要在这个列表中添加/删除更多项目的灵活性,并实现相应的效果


注意:我在几个框架/体系结构约束下运行,所以是的,“如果你不得不这样做,那就是糟糕的体系结构”,但这正是我需要做的。我不知道这是否可能。

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

@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

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

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)
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'])