【发布时间】:2015-11-29 17:03:57
【问题描述】:
我的大部分编程背景是 C++ 和 Java,但出于职业原因,我开始学习 Python。我注意到的第一件事是 Python 对包和命名空间的新方法,但是在谷歌搜索了一段时间并做了一些实验之后,我想我开始掌握它的窍门了。
然后我读到this,这表明我刚刚学到的一切都是错误的。所以现在我再次感到困惑,我无法弄清楚我应该如何组织我的代码。
这是一个非常具体的问题,我真的不知道如何正确回答任何版本的 Python,尤其是我不知道答案是否从 Python 2 更改为 3。假设我想要一个类一个克隆的 github repo,存储在:
/Users/me/my_teams_code/some_project/package/IWantThisClass.py
但是假设我在这里还有一些其他项目:
/Users/me/my_own_code/some_other_project1/...
/Users/me/my_own_code/some_other_project2/...
/Users/me/my_own_code/some_other_project3/...
每个都使用 IWantThisClass。一种策略似乎是每次都手动将正确的目录添加到 sys.path 中,但这相当麻烦——尤其是当我只是在 Jupyter notebook 中进行试验时。我在谷歌搜索后确定的解决方案是将包目录添加到 bash 中的 PYTHONPATH 变量中;这在“import IWantThisClass”工作得很好的意义上是有效的。但我在上面的 Coghlan 的帖子中读到:
“下一个陷阱存在于所有当前版本的 Python 中,包括 3.3,并且可以总结为以下一般准则:'永远不要将包目录或包内的任何目录直接添加到 Python 路径'。 "
那么解决这个问题的“正确”方法是什么?
【问题讨论】:
-
你能澄清一下你添加了什么“包目录”吗?该警告的意思是,如果
package是包含包的顶级__init__.py的目录,则应将其 包含 目录添加到路径中。不清楚这是否是您所说的“包目录”。如果不知道示例中的哪些目录具有__init__.py并因此是 Python 包,则很难知道应该将哪些目录添加到路径中。 -
嗯,一条评论是 Python 3 不再需要 init.py 进行导入(我从链接中学到的许多东西之一......),事实上,当我添加/Users/me/my_teams_code/some_package/package 到 PYTHONPATH 导入工作有或没有 init.py。但是为了论证,我们假设目录“包”包含顶级 init.py 文件。
-
另一条评论:我可能参与了更新我们的代码以符合 Python 3 的过程,所以为了这个问题,让我们将 my_teams_code 的内容视为我可以控制的内容。
-
如PEP 420 中所述,
__init__.py仅对于命名空间包是可选的。大多数软件包仍然需要__init__.py。
标签: python python-3.x namespaces