【发布时间】:2020-12-08 14:18:41
【问题描述】:
我在命名空间包中的单元测试中遇到了一个奇怪的问题。 Here's an example I built on GitHub。这是基本结构:
$ tree -P '*.py' src
src
└── namespace
└── testcase
├── __init__.py
├── a.py
├── sub
│ ├── __init__.py
│ └── b.py
└── tests
├── __init__.py
└── test_imports.py
4 directories, 6 files
我希望命名空间包中的相对导入将维护命名空间。通常情况下,这似乎是真的:
$ cat src/namespace/testcase/a.py
print(__name__)
$ cat src/namespace/testcase/sub/b.py
print(__name__)
from ..a import *
$ python -c 'from namespace.testcase.sub import b'
namespace.testcase.sub.b
namespace.testcase.a
但如果我涉及测试,我会感到惊讶:
$ cat src/namespace/testcase/tests/test_imports.py
from namespace.testcase import a
from ..sub import b
$ python -m unittest discover src/namespace/
namespace.testcase.a
testcase.sub.b
testcase.a
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
src/namespace/testcase/a.py 中的代码运行了两次!在我的情况下,这导致我存根的单例被重新初始化为真实对象,随后导致测试失败。
这是预期的行为吗?这里的正确用法是什么?我是否应该始终避免相对导入(如果我的公司决定重命名某些东西,则必须进行全局搜索和替换?)
【问题讨论】:
标签: python namespaces python-unittest