python项目中文件夹结构的pythonic方式

pythonic way of folder structure in python project

本问题已经有最佳答案,请猛点这里访问。

我有几个模块(类文件),一个应用程序(application.py)将创建这些类的对象,并将使用它。

现在,我打算这样做:

1
2
3
4
5
6
7
8
9
10
11
root folder
        |
        |--classA--classA.py, __init__.py
        |--classB--classB.py, __init__.py
        |--classC--classC.py, __init__.py
        |--classD--classD.py, __init__.py
        |--requirements.txt
        |--setup.py
        |--application.py
        |--__init__.py
        |--Readme

如果这是正确的,有人能提出建议吗?我计划冻结我的文件夹结构。foldername(classa)、filename(classa.py)和classname(classa:)之间有什么关系?用什么方法命名这些?

非常感谢你的帮助,

阿纳布


我喜欢这个博客中建议的项目结构。我在我自己的Github repo中复制了它,这里有存根文件。这是它的样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
cmdline_bootstrap/
├── docs
├── test
├── bootstrap
│   ├── __init__.py
│   ├── __main__.py
│   ├── bootstrap.py
│   └── stuff.py
├── bootstrap-runner.py
├── LICENSE
├── MANIFEST.in
├── README.rst
└── setup.py

这样的结构允许文件夹bootstrap打包并作为库或命令行应用程序分发。将测试文件夹放在主模块之外可以方便地使用python setup.py test进行测试。将Doc文件夹放在主模块之外,可以方便GitHub在GitHub页面上自动部署文档。

对于您的特定项目,我可能会在引导文件夹中执行如下操作:

1
2
3
4
5
6
7
8
9
cmdline_bootstrap/
├── bootstrap
│   ├── __init__.py
│   ├── __main__.py
│   ├── file_handlers: read_automation_rules.py, output_automation_results.py, __init__.py
│   ├── optimization_functions: cost_funciton_reduce_foo.py, __init__.py
│   └── bootstrap.py

...

我建议您有意构建文件夹。例如,一个文件夹包含处理文件系统读/写的所有文件。另一个文件夹可能具有您尝试使用自动化应用程序的所有不同优化功能。当然,你需要更多的文件夹。

与您的示例相反,我认为每个文件夹应该包含大约5个文件。1个文件表示您确实不需要文件夹。10个文件意味着您的文件夹对于当前应用程序可能具有更广泛的用途。

编辑:

同样需要注意的是,PEP 8建议对文件夹命名使用以下内容:

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.

使用本指南,class_a.py优于classA.py。对于文件夹,file_readersfileReaders更受欢迎。


做这件事没有Python式的方法。这完全取决于应用程序的语义。Python最特定的东西是:与其他语言(如Java)相反,没有理由每个类都有一个模块。

只需遵循层次结构。模块应该是执行类似操作的类的集合。文件夹应该是执行类似操作(更高级别)的模块集合。如:

printers.py模块可以包含InkjetPrinterLaserPrinter类。这个模块最终可以放在一个inputoutput文件夹中,其中也包含mail.pynetwork.py模块。

不过,认为现在可以修复文件夹结构是过于乐观的。当你编写代码的时候,你会发现你需要的新东西,不需要的旧东西。只要保持代码足够的灵活性,小的更改就不会破坏它。