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

Python简易装饰器函数无法正常运行,报错求助

问题排查:Python装饰器无法正常运行的原因与解决方法

嘿,我一眼就瞅到你这个装饰器代码里的关键问题啦,咱们来一步步拆解清楚:

核心错误原因

你在装饰器auth_login的最后一行写的是return wrapper(),这是致命错误!

装饰器的本质是一个接收函数作为参数、返回新函数的高阶函数。当你用@auth_login装饰login函数时,Python会自动执行auth_login(login)——如果返回wrapper(),相当于直接调用了wrapper函数并返回它的执行结果(而wrapper没有return语句,结果就是None)。这会导致原来的login函数被替换成了None,后面再调用login('setu', 'setu')时,本质上是在调用None(),自然会触发报错。

正确的做法是返回wrapper这个函数对象本身,而不是调用它。

修复后的代码

def auth_login(func):
    def wrapper(*args, **kwargs):
        print("Authenticating......")
        func(*args, **kwargs)
    # 这里返回wrapper函数对象,而非调用它
    return wrapper

@auth_login
def login(username, password):
    print("Successfully logged in:", username)

login('setu', 'setu')

预期运行结果

修复后执行代码,你会得到符合预期的输出:

Authenticating......
Successfully logged in: setu

额外小提示

如果你的被装饰函数有返回值,记得在wrapper里也要返回func(*args, **kwargs)的结果,才能完整保留原函数的行为:

def auth_login(func):
    def wrapper(*args, **kwargs):
        print("Authenticating......")
        # 保留原函数的返回值
        return func(*args, **kwargs)
    return wrapper

@auth_login
def login(username, password):
    return f"Successfully logged in: {username}"

print(login('setu', 'setu'))

内容的提问来源于stack exchange,提问作者setu shwetank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:20:13