【发布时间】:2018-05-26 18:39:22
【问题描述】:
编辑:装饰器应该在运行时对函数做一些事情,而不是修改它。
我希望能够在函数顶部添加一个装饰器,以便在脚本开始时使用参数执行,并打印结果(作为示例)。
类似于下面的代码,除了下面的代码不起作用,因为我不知道将参数传递给它的简洁方法。我不想修改原始函数,只是在解释函数时将其作为“测试”部分。
def test_decorator(func, *args, **kwargs): # I'm aware this doesn't work. I'm modeling it after class methods for simplicity sake.
print("Passed:", args, kwargs,
"\nResult:", func(*args, **kwargs))
return func
@test_decorator(70, 20, 10, "last_arg_example:")
def test_example(arg1, arg2, arg3=None, arg4="arg4_example:"):
print(arg4, arg1 + arg2 + (arg3 if arg3 else 0))
我知道装饰器定义的第一行搞砸了,但我也不清楚如何修复它。我能找到的所有东西都使用某种“包装器”,但我不想修改原始文件,就像我说的那样。
如果函数不需要参数,我也应该能够在它上面只用@test_decorator 来装饰它。或者即使它确实需要参数,也不要对实际函数执行任何操作并完全打印其他内容。
我该怎么做?
编辑: 为了更简洁,我希望装饰器执行它后面的函数,并将参数传递给装饰器并打印输出。
>>> @decorator(4, 5)
>>> def test1(arg1, arg2):
... return arg1 + arg2
...
9
>>>
进一步的功能是通过不向函数传递任何参数来处理不带参数。这里有两种情况:
>>> @decorator
>>> def test2(arg1=4, arg2=5):
... return arg1 + arg2
...
9
>>>
如果参数没有默认值:
>>> @decorator
>>> def test1(arg1, arg2):
... return arg1 + arg2
...
Traceback (most recent call last):
File "<stdin>", line 1 in <module>
TypeError: test1() takes exactly 2 arguments (0 given)
>>>
请记住,我知道交互式解释器不是这样工作的。我实际上并没有尝试这些示例;然后我打了出来。无论如何我都无法测试这些示例,因为我没有适合它们的装饰器。
【问题讨论】:
-
现在听起来您希望装饰器调用被定义的函数 as 它正在被装饰。将参数传递给装饰器...正确吗?
-
@martineau 是的,正确的。亦不修改原文,重述以备。
-
好的,在装饰器中调用被装饰函数的结果应该如何处理?
-
@martineau 只需打印结果,然后可能会将其记录到列表中。这个装饰器将在一个实用程序文件中定义,所以我想知道除了函数定义上方的行之外,不修改任何内容的“最佳”方法是创建结果注册表。
-
spikespaz:好的,请参阅下面my answer 的最新更新。
标签: python python-3.x function scope decorator