我需要向多个函数添加一个修饰符my_decorator
-。我不想在每个函数定义上添加@my_decorator
,而是想将它添加到一个独立代码块中的所有函数中,这样我就把所有的东西都放在一个地方了。在
有没有一种干净的,Python式的方法来做到这一点?很明显,我可以做下面的事情,但它有点重复。如果我更改了decorator名称,我需要在每一行中更新它。在
function1 = my_decorator(function1)
function2 = my_decorator(function2)
function3 = my_decorator(function3)
我的第二个想法是将函数放在一个列表中并对其进行迭代,但以下两种方法都不起作用。它们修改每个列表索引处的值,同时保持原始函数不变,因此我必须调用,例如,function_list[0]()
来获得添加了修饰符的函数。在
我终于找到了一种可行的方法,但是使用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()
这几乎肯定是一个非常糟糕的主意。在
你要做的是用名字替换任意的全局变量。正确的方法是调用
globals
并修改结果dict例如:
当然,这看起来很难看也很难看,但那是因为你所做的事情本身就是丑陋的,所以Python不会特意把它弄得好看,这样你就可以假装不是这样了。在
另外,请注意,但是您这样做,您必须至少重复一次所有函数的名称。为了避免重复你的装饰师的名字重复同样的次数,这真的值得吗?这至少和打字一样多,而且更容易默默地犯错。在
相关问题 更多 >
编程相关推荐