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

