Python使用装饰器调用get_frame_work()报NoneType不可调用错误如何修复
问题原因
Python的装饰器语法@main等价于在被装饰函数定义完成后执行get_frame_work = main(get_frame_work)。你定义的main函数没有显式返回值,执行完默认返回None,因此装饰完成后get_frame_work变量实际指向None:
- 只写
get_frame_work只是引用变量,不会触发类型校验,因此没有报错 - 执行
get_frame_work()时会校验变量是否为可调用对象,就会触发TypeError: 'NoneType' object is not callable报错
解决方案
根据你的使用场景可选择两种修复方式:
场景1:需要保留装饰器写法
调整main函数结构,新增内层包装函数,把原有逻辑放在包装函数内,最后返回包装函数,保证装饰后的get_frame_work依然是可调用对象:
import sys def main(frame_work): # 新增内层包装函数承载原有逻辑 def wrapper(): res = frame_work() if res == "selenium": pass elif res == "puppeteer": pass elif res == "play_wright": pass else: raise Exception("Invalid command!") # 可按需返回原函数的执行结果 return res # 返回包装函数,保证装饰后依然是可调用对象 return wrapper @main def get_frame_work(): return str(sys.argv[1].lower()) get_frame_work() # 此时调用正常
场景2:仅需要把get_frame_work作为参数传给main执行一次
不需要使用装饰器语法,直接调用main传参即可,删除@main装饰和末尾的get_frame_work()调用:
import sys def main(frame_work): if frame_work() == "selenium": pass elif frame_work() == "puppeteer": pass elif frame_work() == "play_wright": pass else: raise Exception("Invalid command!") def get_frame_work(): return str(sys.argv[1].lower()) # 直接调用main传参即可 main(get_frame_work)
内容的提问来源于stack exchange,提问作者wdafoe666
相关产品推荐
相关产品推荐

