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

PyTest中Python数据生成器函数异常问题求助

问题根源:Python可变默认参数的陷阱

这是Python的经典坑,跟PyTest没关系,是你用了可变默认参数导致的问题。

问题原因

Python里函数的默认参数是在函数定义时就创建的,而不是每次调用函数时重新生成。你写的gen_data函数里,child = []这个默认值是个可变的列表对象,整个程序运行期间只会创建一次:

  • 第一次调用gen_data("parent")时,用了这个默认的空列表,之后你给它append了子对象,这个列表就被修改成带内容的了。
  • 第二次调用gen_data("parent two")时,因为没传child参数,还是复用了之前那个已经被修改过的列表,所以新生成的parent里会带着之前的子对象。

虽然两次返回的字典ID不同,但它们的child字段指向的是同一个列表对象,这就是问题所在。

修复方法

把可变默认参数换成不可变的(比如None),然后在函数内部初始化空列表:

修改hf.py里的gen_data函数:

def gen_data(data_a, data_b = "one", child = None):
    # 如果没传child参数,就新建一个空列表
    if child is None:
        child = []
    return {
        "data_a": data_a,
        "data_b": data_b,
        "child": child
    }

这样每次调用gen_data时,如果没传child,都会新建一个全新的空列表,就不会出现之前的子对象残留的问题了。

验证结果

修改后再运行pytest -s -v test.py,test_Two的输出就会符合你的预期:

test.py::test_One 4322510784 {'data_a': 'parent', 'data_b': 'one', 'child': [{'data_1': 'child', 'data_2': 'two', 'data_3': 'three'}]}
PASSED
test.py::test_Two 4322601792 {'data_a': 'parent two', 'data_b': 'one', 'child': []}
PASSED

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:07:54