首页 > 解决方案 > TypeError:将参数传递给装饰器函数时,“NoneType”对象不可调用

问题描述

我试图弄清楚如何使用 python 装饰器,我试图通过创建我自己的timeit用于计时函数调用的命令版本来做到这一点。此代码正在运行

def mytimeit(f):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = f(*args, **kwargs)
        print(f"Function took {time.time() - start} seconds to run.")
        return result
    return wrapper


@mytimeit
def simple_loop(n=10, sleep=0.2):
    for i in range(n):
        time.sleep(sleep)

我现在要做的是以某种方式将参数传递给该装饰器。我已经看到它完成了,看起来我必须将我的装饰器包装在另一个函数中,但我无法让它工作,我不确定为什么。

这就是我所拥有的

def mytimeit_with_args(stuff_to_print):
    def decorator(f):
        def func(*args, **kwargs):
            start = time.time()
            result = f(*args, **kwargs)
            print(stuff_to_print)
            print(f"Function took {time.time() - start} seconds to run.")
            return result
        return func

@mytimeit_with_args("just some stuff")
def harder_loop(n=10, sleep=0.2):
    for i in range(n):
        time.sleep(sleep)

我得到的错误是TypeError: 'NoneType' object is not callable

我做错了什么?

标签: pythonpython-3.x

解决方案


你实际上真的很亲近。您收到该错误的原因是因为您没有在mytimeit_with_args函数的最后返回任何内容,因此 NoneType is not callable 错误。mytimeit_with_args您只需要在这样的末尾添加一个返回语句

def mytimeit_with_args(stuff_to_print):
    def decorator(f):
        def func(*args, **kwargs):
            start = time.time()
            result = f(*args, **kwargs)
            print(stuff_to_print)
            print(f"Function took {time.time() - start} seconds to run.")
            return result
        return func
    return decorator

推荐阅读