python - 防止包导入自身

标签 python namespaces

好的,让我们举个例子(下面是原始问题)。

我制作了一个名为“myproject”的包,它显示了我面临的问题。

  1. 在此处下载软件包:https://dl.dropbox.com/u/11013311/myproject.zip
  2. 安装包(例如:sudo python setup.py develop)
  3. 打开一个 Ipython session 并输入:“import myproject”
  4. 如果您开始输入“myproject”。并点击 Tab 键两次以获取可用的方法/值...,您会看到“myproject.myproject”,它自己显示了同样的问题。

你们中有人能解释一下我做错了什么吗? Andrew Alcock 的回答没有帮助我解决问题,或者至少我看不出问题出在哪里。

当然,这么简单的例子,包__init__.py文件没必要那么复杂,但在我的实际项目中我确实需要COOL 可通过 myproject.COOL 访问实例。

感谢您的回答!

编辑: 我已授予 utapyngo 赏金,因为他的解决方案很有效,而且我学到了更多东西(具有深层子模块的相对导入)。但我要感谢 Andrewnehz 的回答(nehz 也提供了解决我问题的解决方案,但我非常主观地发现它“不那么漂亮”;Andrew 提供了有用的建议)。可惜我不能分享赏金。

**

原始问题:

**

我不确定问题的措辞是否正确。我创建了一个包含多个子包的大型代码,为简单起见,我们将其称为“CODE”。

问题是:'CODE' 出现在命名空间中,所以我可以有 CODE.CODECODE.CODE.CODE 等...无限数量对我来说这看起来很奇怪,可能(我猜)暗示出了什么问题(尽管代码在没有警告的情况下运行完美)。

我想这个问题与我的 __init__.py 和我的代码结构有关,所以我在这里提供了更多信息。

简化的代码结构:

CODE
  | __init__.py
  | tools
     | __init__.py
     | mytools.py
  | other
     | __init__.py
     | init.py
  | sub
     | __init__.py
     | module.py

文件:__init__.py(第一个,在CODE的根)

import CODE.tools.mytools as MyTools
import CODE.other.init

OBJ = CODE.other.init.function()
...

mytools.py 文件不会从 CODE 或任何其他可能导入 OBJ 的模块中导入 OBJinit.py 可以导入模块,例如 mytools.py。 最后,像 module.py 这样的模块可以导入 mytools.pyOBJ(来自 CODE)。通常,所有导入都是绝对导入,例如:from CODE.sub.module import func

有人对这种行为有解释吗?我没有在SO上找到任何相关问题,但这可能是由于我的措辞错误。

最佳答案

问题是您导入的(基本上是顶层 __init__.py 文件)包含对自身(模块)的引用进口。由于该模块现在有一个包含自身的 namespace ,您现在可以通过 CODE.CODE 访问它。 ... .CODE.MyTools.

我建议:

1) 在你的每个子包(工具,其他)中有一个 __init__.py

2) 在 CODE 的模块中,不要“导入 CODE”或任何子包。而是直接导入您感兴趣的模块(文件)。

例如,在 CODE.sub.module.py 中:

不要:

import CODE.other     # "other" is a package (a directory)

做:

import CODE.other.init    # "init" is a module (a file)

理智就这样撒谎。

编辑:重构你的具体例子

The file mytools.py do not import OBJ from CODE, or any other module that may import OBJ. init.py may import modules such as mytools.py.

好的

Finally, modules like module.py may import either mytools.py or OBJ (from CODE).

这是你的问题。不要在此处导入 CODE。如果您需要简化相当长的“CODE.other.init.function”,您可以使用 from .. import 语句来完成:

> from CODE.other.init import function as OBJ 

但请注意,许多 Pythonites 不喜欢这个,因为它会导致混淆。

Usually, all import are made with absolute import, such as in: from CODE.sub.module import func.

好的

关于python - 防止包导入自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11513866/

相关文章:

c++ - 在不同命名空间中将函数声明为内联友元

c# - 合并 xml 命名空间

c# - ASP.net 核心命名空间不同步

python - 使用mongo-connector的部分单词搜索在Elasticsearch(elasticsearch-py)中不起作用

python - 您能否使用 Sklearn 的 Transformer API 持续跟踪列标签?

c++ - C++ 中命名空间别名的范围是什么?

xml - 如何更改命名空间

python - 使用 asyncio 程序挂起

python - 'max_pooling2d_3/MaxPool' 1 减 2 导致的负维度大小

python - 如何将基于 tkinter 的应用程序与自定义图标捆绑在一起?