如果只遵守一些流行的python约定和标准,那么您可以做一些事情来改进您的组织。
如果您搜索这个主题,您将不可避免地遇到推荐PEP8准则的人。这些是组织python代码的事实上的规范标准。Modules should have short, all-lowercase names. Underscores can be
used in the module name if it improves readability. Python packages
should also have short, all-lowercase names, although the use of
underscores is discouraged.
根据这些指导原则,项目模块的命名方式应如下:foo/
__init__.py
foo.py
module1.py
module2.py
module3.py
我发现通常最好避免在__init__.py中不必要地导入模块,除非是出于名称空间的原因。例如,如果希望包的命名空间如下所示from foo import Foo
而不是from foo.foo import Foo
那么把from .foo import Foo
在你的__init__.py里。随着包变大,一些用户可能不想使用所有的子包和模块,因此通过在__init__.py中隐式导入这些模块来强制用户等待加载所有这些模块是没有意义的。此外,您还必须考虑是否希望将module1、module2和module3作为外部API的一部分。它们是否仅由Foo使用,而不打算用于最终用户?如果它们只在内部使用,那么不要将它们包含在__init__.py
绝对值from foo import module1
from foo import module2
from foo import module3
显式相对from . import module1
from . import module2
from . import module3
这将防止与其他包和模块一起出现任何可能的命名问题。如果决定支持Python3,也会更容易,因为Python3不支持当前使用的隐式相对导入语法。
而且,包中的文件通常不应该包含if __name__ == '__main__'
这是因为将文件作为脚本运行意味着它不会被视为其所属包的一部分,因此它将无法进行相对导入。
向用户提供可执行脚本的最佳方法是使用^{} or ^{} feature of ^{}。根据使用的方法,组织脚本的方式可能有所不同,但我通常是这样组织脚本的:foo/
__init__.py
foo.py
...
scripts/
foo_script.py
setup.py