【发布时间】:2015-05-19 08:26:14
【问题描述】:
我正在尝试测量这样的修饰函数的运行时间:
import time
def timing_function(some_function):
"""Outputs the time a function takes to execute."""
def wrapper():
t1 = time.time()
some_function()
time.sleep(1)
t2 = time.time()
return "Time it took to run the function " + some_function.__name__ + " is " + str((t2-t1)) + "\n"
return wrapper
def tags(tag_name):
def tags_decorator(my_func):
"""Adds tags to a string."""
def func_wrapper(name):
return "<{0}>{1}</{0}>".format(tag_name, my_func(name))
return func_wrapper
return tags_decorator
@timing_function
@tags("p")
def get_text(name):
return "Hello "+name
那我试试
print get_text("World")
但是得到
TypeError: wrapper() takes no arguments (1 given)
有趣的是,我添加了一段代码来检查我给 wrapper() 的参数是什么:
def wrapper(*args):
print "args", args
# ...
好像得到了参数“World”,其实应该是传给get_text的。
颠倒装饰器的顺序并没有帮助。我可以做些什么来同时实现带参数和不带参数的一般装饰器?
当然,我可以将两个代码合并到一个包装器中,但这不是我想要的......
我正在使用 python 2.6
【问题讨论】:
-
这段代码的缩进好像被拍到了——也许你可以调整一下?
-
@PM2Ring:不,因为这是关于将参数从装饰器包装器传递到装饰器函数。
get_text()函数接受一个参数,timing_function生成的包装器根本不会传递它。
标签: python decorator python-2.6 python-decorators