python - 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
我做错了什么?
解决方案
你实际上真的很亲近。您收到该错误的原因是因为您没有在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
推荐阅读
- php - 如何在特定页面的 URL 中添加用户名或 ID [WordPress]
- html - 如何用css和html的图像填充一个圆圈?
- sql - 在视图中按复合字段搜索
- php - WC Composite 产品以定义的步骤数添加组件的更多产品
- docker - Kubernetes 不采用 dockerfile 时区
- java - 如何从另一个类中的另一个公共整数调用一个公共整数?
- html - 在 HTML 上访问 root 时 ./ 和 / 之间的区别
- c++ - 对可变参数模板和模板类型推导的误解
- google-apps-script - 在脚本中添加 5 小时以删除旧日期文件 (GAS - Google Drive)
- c++ - 在 C++ 中打印具有固定数量零的整数