我是一名自学成才的程序员,需要您使用python中的@decorator帮助。
这是我的问题。在我用decorator运行other(multiply)之后,出现一个错误:wrap_func()接受0个位置参数,但给出了1个。而且我不知道为什么以及如何解决此问题。 我的主要目的是学习装饰器的工作方式。因此以下代码可能没有意义。
def multiply(a,b):
return a*b
###pass in multiply function in other()
def other(multiply):
print('passed in')
print(multiply(1,2))
other(multiply)
### result shows passed in and 2, as expected
### Set up decorator func here
def decorator_prac(old_func):
def wrap_func():
multiply(1,2)
old_func()
print(1+7)
return wrap_func
###add decorator on def other(multiply)
@decorator_prac
def other(multiply):
print('what should I say')
print(multiply(1,2))
###Run other(multiply)
other(multiply)
输出:
passed in
2
Traceback (most recent call last):
File "so.py", line 28, in <module>
other(multiply)
TypeError: wrap_func() takes 0 positional arguments but 1 was given
答案 0 :(得分:0)
您在传递的功能和使用方式之间存在差异。这是跟踪和解决方案。我仔细检查了装饰器看到的功能,然后添加了必需的参数。如果需要通用,则需要通用参数列表,例如*args
。
### Set up decorator func here
def decorator_prac(old_func):
#def decorator_prac(old_func):
print("decorator arg", old_func) # Track what is passed in
def wrap_func(func_arg): # Accommodate the function profile
multiply(1,2)
old_func(func_arg) # Implement the proper profile
print(1+7)
return wrap_func
输出:
passed in
2
decorator arg <function other at 0x7f0e7b21b378>
what should I say
2
8
答案 1 :(得分:0)
装饰器接受一个函数对象(在这里:other(multiply)
)并返回另一个函数wrap_func()
来替换它。名称other
现在表示已替换的函数。
虽然原始函数带有参数,但是替换没有。用参数调用无参数函数失败,如图所示。