1

我想为一个大型项目建立一个很好的模块层次结构。(Python 似乎妨碍了这一点)我对模块和包的区别以及它们与命名空间的 C++ 概念的关系感到困惑。具体来说,我的项目是一个编译器,代码生成阶段想要从一组抽象表示中查询属性,这些抽象表示在不同的目录中(实际上在层次结构中很远)

问题可以表述为:

Ass:让 a.py 和 b.py 成为项目层次结构中某处的两个源文件

然后:我想从 a.py 引用 b.py 中定义的函数——理想情况下,使用项目定义良好的根目录(即 /src)的相对路径。我们想要一个通用的解决方案,这将永远有效..

Dirty hack:这听起来很荒谬,但我将这个项目中包含 .py 的所有子目录放入 PYTHONPATH 中,我们将能够用它们的名称引用它们,但是这样代码的读者就会失去任何层次感和关系感不同的项目类等。

注意:Python.org 上的教程只提到了从文件 c.py 引用放置在其父目录中的文件 d.py 的特殊情况。使 Python 扩展到真正的大型项目的普遍性在哪里?

4

1 回答 1

1

我不确定这是否是问题,但让我们看看。

假设我有以下包方案(__init__.py为便于阅读而排除的文件):

foo/baz/quux/b.py
foo/baz/quux/quuuux/c.py
foo/bar/a.py

我的foo/baz/quux/b.py文件包含以下内容:

def func_b():
    print 'func b'

foo/baz/quux/quuuux/c.py的是:

def func_c():
    print 'func c'

如果包含foo(在您的情况下为src*)的根目录位于 Python 路径中,则 aurfoo/bar/a.py文件可以从以下位置导入任何其他模块foo

import foo.baz.quux.b as b
import foo.baz.quux.quuuux.c as c

def func_a():
    b.func_b()
    c.func_c()

并且可以使用foo/bar/a.py这种方式:

import foo.bar.a as a

a.func_a()

你试过了吗?你有什么错误吗?

* 当你部署你的项目时,我不相信根会是src,但让我们通过省略它来保持它的简单:)

于 2012-06-21T19:09:38.357 回答