You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:02:20