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
相关产品推荐
相关产品推荐

