给多个函数分配一个装饰器的python方法?

2024-04-26 14:03:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要向多个函数添加一个修饰符my_decorator-。我不想在每个函数定义上添加@my_decorator,而是想将它添加到一个独立代码块中的所有函数中,这样我就把所有的东西都放在一个地方了。在

有没有一种干净的,Python式的方法来做到这一点?很明显,我可以做下面的事情,但它有点重复。如果我更改了decorator名称,我需要在每一行中更新它。在

function1 = my_decorator(function1)
function2 = my_decorator(function2)
function3 = my_decorator(function3)

我的第二个想法是将函数放在一个列表中并对其进行迭代,但以下两种方法都不起作用。它们修改每个列表索引处的值,同时保持原始函数不变,因此我必须调用,例如,function_list[0]()来获得添加了修饰符的函数。在

^{2}$

我终于找到了一种可行的方法,但是使用exec()似乎不是很像Python,所以我想知道是否有更好的方法。在

function_list = ['function1', 'function2', 'function3']
for index in range(len(function_list)):
    exec("{0} = my_decorator({0})".format(function_list[index]))

下面是我测试此代码的代码,它将添加一个在调用函数之前打印“Hello”的修饰符:

def my_decorator(function):
    def wrapper(*args, **kwargs):
        print("Hello!", end=' ')
        return function(*args, **kwargs)
    return wrapper

def ask_about_day(name):
    print("How is your day going, {0}?".format(name))

def comment_about_weather():
    print("It's lovely outside today, isn't it?")

# assign decorator using exec() - possibly unpythonic
function_list = ['ask_about_day', 'comment_about_weather']

for index in range(len(function_list)):
    exec("{0} = my_decorator({0})".format(function_list[index]))

def main():
    name = input("What is your name? ").capitalize()
    if name:
        ask_about_day(name)
    else:
        comment_about_weather()


main()

Tags: 方法函数代码nameindexmydeffunction
1条回答
网友
1楼 · 发布于 2024-04-26 14:03:51

这几乎肯定是一个非常糟糕的主意。在

你要做的是用名字替换任意的全局变量。正确的方法是调用globals并修改结果dict

例如:

g = globals()
for func in function1, function2, function3:
    g[func.__name__] = my_decorator(func)

当然,这看起来很难看也很难看,但那是因为你所做的事情本身就是丑陋的,所以Python不会特意把它弄得好看,这样你就可以假装不是这样了。在

另外,请注意,但是您这样做,您必须至少重复一次所有函数的名称。为了避免重复你的装饰师的名字重复同样的次数,这真的值得吗?这至少和打字一样多,而且更容易默默地犯错。在

相关问题 更多 >