【发布时间】:2018-11-03 01:18:36
【问题描述】:
谁能告诉我我犯了什么错误。
装饰器
import time
def f1(f):
a = time.time()
f()
b = time.time()
c = b-a
print("time required is", c)
@f1
def f3(f2):
n = []
for i in range(1000):
n.append(i)
print(sum(n), "for F3")
f2()
@f3
def f4():
n = []
for i in range(1000):
n.append(i)
print(sum(n), "for F4")
f4
o/p:
Traceback(最近一次调用最后一次):
File "C:/test.py", line 13, in <module>
@f1
File "C:/test.py", line 7, in f1
f()
TypeError: f3() missing 1 required positional argument: 'f2'
Process finished with exit code 1
希望实现这样的目标:
def decorator_with_args(decorator_to_enhance):
def decorator_maker(*args, **kwargs):
def decorator_wrapper(func):
return decorator_to_enhance(func, *args, **kwargs)
return decorator_wrapper
return decorator_maker
@decorator_with_args
def decorator_decorator(func, *args, **kwargs):
def wrapper(function_arg1, function_arg2):
print("Decorated with {0} {1}".format(args, kwargs))
return func(function_arg1, function_arg2)
return wrapper
@decorated_decorator(42, 404, 1024)
def decorated_function(function_arg1, function_arg2):
print("Hello {0} {1}".format(function_arg1, function_arg2))
decorated_function("宇宙和", "一切")
【问题讨论】:
-
装饰器必须返回一个可调用对象(如函数)。
-
我完全不清楚您希望这段代码做什么。如果没有明确说明您的意图,就不可能说出您犯了什么“错误”。例如,您可能打算创建一些引发错误的代码。我不知道。
-
@juanpa.arrivillaga 基本上我想做的是计算运行函数 f3 和 f4 的时间差所以我希望 fn f1 记下运行 fn f3 和 f4 之前和之后的时间并给我时间上的差异。在此示例中,我如何使用装饰器调用 fn,而后者又使用装饰器调用另一个函数。我希望我是有道理的,为混乱道歉。
-
这没有多大意义。装饰器返回函数,它们不用于调用它们。听起来你只想要正常的功能。注意,你所有的装饰器都返回
None。 -
@juanpa.arrivillaga 基本上我正在寻找制作一个装饰器链(将一个装饰器解析为另一个)我看了几个例子但不太了解它。
标签: python python-3.x python-decorators