Python如何为__module__属性赋值?测试环境差异引发疑问
Python中__module__字段的设置逻辑及测试建议
一、__module__的设置规则
__module__是Python自动给模块内函数、类等对象添加的属性,用来标记该对象所属模块的完整导入路径,核心逻辑完全依赖Python的sys.path配置:
- 当直接用
python -m unittest运行测试时,如果当前工作目录是$REPO_ROOT/tests,这个目录会被加入sys.path。此时unit/foo/bar/baz/test_module.py会被识别为顶层模块unit的子模块,所以函数的__module__就是unit.foo.bar.baz.test_module。 - 用Poetry运行测试时,Poetry默认会把项目根目录
$REPO_ROOT加入sys.path。这时tests本身成为顶层模块,测试模块的完整导入路径就变成了tests.unit.foo.bar.baz.test_module,对应函数的__module__自然就是这个值。 - 总结来说:__module__的前缀由Python识别的「导入根目录」决定——哪个目录在
sys.path里,该目录下的第一级文件夹就会成为模块路径的顶层前缀。
二、关于测试的建议
你应该移除检查特定模块名的测试,理由如下:
- __module__的值是环境可变的,不同运行工具、不同工作目录都会导致
sys.path变化,进而改变__module__的结果,不适合作为固定断言的内容。 - 如果需要追踪测试函数的来源,可以用更稳定的属性替代,比如函数的
__qualname__(包含函数的嵌套层级信息),或者直接用测试框架的内置方法获取测试用例的标识名称。
内容的提问来源于stack exchange,提问作者pgoldste
相关产品推荐
相关产品推荐

