python中的装饰器查询

时间:2018-09-26 16:20:23

标签: python python-decorators

我是一名自学成才的程序员,需要您使用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

2 个答案:

答案 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现在表示已替换的函数。

虽然原始函数带有参数,但是替换没有。用参数调用无参数函数失败,如图所示。