如何在Python中不使用装饰器编写并调用包装函数
问题原因
你这段代码报错的核心原因是调用wrapper时传错了参数:
- 你写的
wrapper(test1(1,2))其实是先执行test1(1,2),而test1没有返回值,默认返回None,所以wrapper实际收到的参数是None。 - 然后wrapper里执行
func(),就是尝试调用None,自然会报'NoneType' object is not callable的错误。
不使用装饰器的包装函数写法
要实现能包装任意参数函数的wrapper,不用装饰器的话,得让wrapper接收函数对象和函数需要的参数,用可变参数*args和**kwargs来适配不同函数的参数列表。
修改后的代码
import external_library # example def wrapper(func, *args, **kwargs): # 这里可以添加包装逻辑,比如打印日志、计时、异常捕获等 print(f"正在执行函数: {func.__name__}") # 调用原函数并返回结果 result = func(*args, **kwargs) return result def test1(a,b): print(a,b) def test2(a,b,c,d): print(a,b,c,d) # 正确调用方式:传函数对象 + 对应参数 wrapper(test1, 1, 2) wrapper(test2, 1, 2, 3, 4) # 如果external_library.some_api需要参数,就这么传:wrapper(external_library.some_api, param1, param2) wrapper(external_library.some_api)
关键说明
*args用来接收任意数量的位置参数,**kwargs接收任意数量的关键字参数,这样不管原函数参数多少,wrapper都能兼容。- 调用wrapper时,第一个参数必须是函数本身(比如
test1,不带括号),后面跟着原函数需要的参数。 - 你可以在wrapper里添加任何包装逻辑,比如调用前后的日志、耗时统计,这些都不会影响原函数的功能。
内容的提问来源于stack exchange,提问作者HG K
相关产品推荐
相关产品推荐

