如何安排使用SQLAlchemy和图形界面开发的应用程序源代码?
我正在开发一个应用程序,使用的是SQLAlchemy和wxPython。我想把它分成几个模块,分别处理业务逻辑、ORM(对象关系映射)和图形用户界面(GUI)。
不过,我不太确定怎么才能做到这一点,让它符合Python的编程风格。
因为要使用这些对象,必须先调用mapping()
这个函数。我考虑把它放在业务逻辑的__init__.py
文件里,但把所有的表定义放在一个单独的orm.py
模块中。
我应该保持这样的结构:
/Business
/__init__.py
| mapping (module1.Class1, orm.table1)
|
/module1.py
Class1
/orm.py
import
table1 = Table()
/GUI
/main.py
| import business
/crud.py
还是说应该用这样的结构:
/Business
/__init__.py
| import
|
/module1.py
Class1
table1 = Table()
mapping (module1.Class1, orm.table1)
/GUI
/main.py
| import business
/crud.py
第一个方法推荐吗?还有其他选择吗?我见过第二种方法,但我不喜欢把数据库处理的代码和业务逻辑的代码放在同一个模块里。我是不是想太多了?这真的不是个大问题吗?
1 个回答
6
我发现Jp Calderone写的这篇文章对如何(不)组织你的Python项目结构提供了很好的建议。按照这个方法,你就不会遇到问题。下面我把全文复制过来:
Python项目的文件系统结构
应该做的:
- 给你的项目目录起个相关的名字。例如,如果你的项目叫做"Twisted",那么顶层目录可以叫做
Twisted
。发布版本时,记得加上版本号后缀,比如Twisted-2.5
。- 创建一个
Twisted/bin
目录,把你的可执行文件放在这里。如果有可执行文件,别给它们加.py
扩展名,即使它们是Python源文件。这里面只放一个导入和调用其他地方定义的主函数的代码。- 如果你的项目可以用一个Python源文件来表达,就把它放到这个目录里,并给它起个相关的名字。例如,
Twisted/twisted.py
。如果需要多个源文件,就创建一个包(Twisted/twisted/
,并在里面放一个空的Twisted/twisted/__init__.py
),然后把源文件放进去。例如,Twisted/twisted/internet.py
。- 把你的单元测试放在包的子包里(注意,这意味着上面提到的单个Python源文件的选项是个小把戏——你总是需要至少一个其他文件来放单元测试)。例如,
Twisted/twisted/test/
。当然,要把它做成一个包,里面有Twisted/twisted/test/__init__.py
。测试文件可以命名为Twisted/twisted/test/test_internet.py
。- 如果你愿意,可以添加
Twisted/README
和Twisted/setup.py
来解释和安装你的软件。不应该做的:
- 不要把源代码放在叫
src
或lib
的目录里。这样会让运行变得困难,因为需要安装。- 不要把测试放在Python包的外面。这样会让测试很难在安装的版本上运行。
- 不要创建一个只有
__init__.py
的包,然后把所有代码放在__init__.py
里。直接做一个模块就好了,这样更简单。- 不要试图想出一些神奇的技巧,让Python能够在用户不把包含模块或包的目录添加到导入路径(通过
PYTHONPATH
或其他机制)时也能导入你的模块或包。你无法正确处理所有情况,用户会因为你的软件在他们的环境中无法正常工作而生气。