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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:09:03