python - Python 模块/包系统对大型项目的可扩展性

标签 python module namespaces package

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

问题可以表述为:

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

然后:我想引用 b.py 中定义的函数 a.py——理想情况下具有来自明确定义的根的相对路径 项目的目录(/src)。我们想要一个通用的 解决这个问题的方法,总是有效的..

肮脏的黑客:这听起来很荒谬,但我把所有包含 .py 的子目录放在上面 项目到 PYTHONPATH 我们将能够用它们的名称引用它们,但是有了这个 代码的读者失去了关于不同项目的任何层次结构和关系感 类(class)等..

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

最佳答案

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

假设我有以下包方案(为了可读性而排除 __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路径中,aur foo/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()

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

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

关于python - Python 模块/包系统对大型项目的可扩展性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11144819/

相关文章:

plugins - Intellij IDEA 看不到插件模块

php - 一个临时编码解决方案,项目类可以在以后轻松升级到命名空间

java - 如何将领域模型与 REST 模块分离?

python - 使用 Darts 进行多协变量时间序列预测

python - 当我的 gitlab 存储库中有新提交时,如何立即执行 python 脚本?

python - Python的sklearn(DecisionTreeClassifier,SVM)之间的区别?

python - git 状态与 python

com - 为什么在 C++ 中的 Windows COM 编程中有这么多方法显式解析为全局命名空间?

c# - 命名空间和类与 .NET Framework 命名空间和类相同

python - F() 表达式与 Django 的奇怪行为