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

Pytest测试FastAPI中MyClass出现意外关键字参数错误

问题分析与解决方案

问题核心

定义的MyClass在FastAPI正常运行时实例化无异常,但使用Pytest测试时抛出TypeError: MyClass.__init__() got an unexpected keyword argument 'api_key',清理缓存后问题仍存在。

排查与解决步骤

1. 确认导入的MyClass版本正确性

最可能的原因是测试代码导入的MyClass并非你编写的目标版本。在测试代码开头添加调试代码,验证方法签名:

from myclass import MyClass
import inspect

# 打印MyClass.__init__的参数签名,确认是否包含api_key
print(inspect.signature(MyClass.__init__))
# 打印模块路径,确认导入的是目标文件
import myclass
print("MyClass所在模块路径:", myclass.__file__)
  • 如果签名中没有api_key,检查是否存在同名模块(如第三方库中的myclass),或目标myclass.py是否在Python可导入路径中。
  • 如果模块路径不是你编写的文件,调整Pytest运行的工作目录,或修改导入语句使用绝对路径。

2. 修复测试代码的变量名冲突

测试代码中存在变量名重复覆盖的问题,虽然不是当前错误的直接原因,但会导致后续逻辑混淆:

# 原代码
client = MyClass(...)
# 修改为
my_class_instance = MyClass(
    api_key="<API_KEY>",
    root_url="http://localhost:8080",
    headers=["authorization", "content-type", "connection"],
    fields_one=["name", "email"],
    fields_two=["password", "phone"],
    debug=True
)
app.middleware('http')(my_class_instance.middleware)

# 后续TestClient实例保留原变量名
client = TestClient(app)

3. 修复MyClass的可变默认参数隐患

虽然不影响当前错误,但__init__中使用可变对象(如列表)作为默认参数会导致多实例共享同一对象的意外问题,建议修改:

class MyClass:
    def __init__(self, api_key, debug=False, root_url="https://app.apitoolkit.io",
                 headers=None, fields_one=None, fields_two=None):
        # 安全设置默认值
        headers = headers or ['authorization', 'cookie']
        fields_one = fields_one or []
        fields_two = fields_two or []
        print(api_key, debug, root_url, headers, fields_one, fields_two)

4. 检查循环导入问题

如果myclass.py与测试文件存在循环导入,会导致模块加载异常。检查myclass.py的导入语句,确保无循环依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:30:07