gpt4 book ai didi

Python 库项目结构最佳实践 : imports and tests

转载 作者:行者123 更新时间:2023-11-28 18:29:15 31 4
gpt4 key购买 nike

我想重构我在日常工作中经常使用的 python 库,将其作为开源发布在 github 上。在这样做之前,我想遵守 python 项目结构的某种最佳实践。我将在下面描述我想做的事情,非常感谢您的建议。

这是我的库 (mylib) 结构:

mylib/
/examples/
simple_example.py
/mylib/
__init__.py
foo.py
bar.py
/tests/
test_foo.py
test_bar.py

文件如下:

#foo.py
def Foo():
print("foo.Foo")


#bar.py
import foo

def Bar():
print("bar.Bar")
foo.Foo()


#test_bar.py
from ..mylib import bar #doesnt work!

class TestBar(unittest.TestCase):
def test_1(self):
bar.Bar()
self.assertEqual(True, True)

if __name__ == '__main__':
unittest.main()


#simple_example.py
from .. import foo #doesnt work!
from .. import bar #doesnt work!

if __name__ == '__main__':
foo.Foo()
bar.Bar()

我想做的是:

1- 最好从/mylib/examples/执行 simple_example.py:

$cd myapp
$cd examples
$python simple_example.py
Traceback (most recent call last):
File "simple_example.py", line 2, in <module>
from .. import foo
SystemError: Parent module '' not loaded, cannot perform relative import

2- 最好从/mylib/tests/执行单个测试文件:

$cd myapp
$cd tests
$python test_bar.py
Traceback (most recent call last):
File "test_bar.py", line 3, in <module>
from ..mylib import bar
SystemError: Parent module '' not loaded, cannot perform relative import

3- 从 mylib root 执行所有测试

$cd myapp
$python -m unittest discover tests #same problem as above!

所以,问题出在simple_example.py和test_bar.py中的import语句。修复这些导入的最佳方法是什么?

请注意,我想使用 python 标准库 unittest 进行单元测试。

谢谢

查理

最佳答案

运行测试代码时,您想进行绝对导入。这是因为当您运行单元测试等时,您应该假设您的“库”安装在本地开发模式下进行测试——不要使用相对导入,因为您不在同一个包中。

下面是如何在 test_foo.py 文件中进行导入,例如:

# test_foo.py
from mylib.foo import Foo

# ... your test code here

一般来说,你应该只在你的库代码中使用相对导入,而不是在你的测试中 =)

希望对您有所帮助。

编辑:您还需要在开发模式下安装您的库,然后才能运行。您可以通过以下两种方式之一执行此操作:

$ python setup.py develop

$ pip install -e .

上述任何一个命令都会检查您项目的 setup.py 文件,该文件告诉 Python 您的包是如何构建/创建的,并将在本地安装它以便您可以运行测试/弄乱它。

关于Python 库项目结构最佳实践 : imports and tests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38773669/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com