【问题标题】:How can I flatten the namespace of just one module?如何展平一个模块的命名空间?
【发布时间】:2014-08-09 21:56:55
【问题描述】:

我有以下简单的项目和包结构:

Project/
    package/
        __init__.py
        a.py
            class One: ...
            class Two: ...
        b.py
            from . import a
            class Three: ...
            class Four: ...

我希望用户能够这样使用它:

import package
# or
from package import Three, Four
from package.a import One, Two
# or
from package import a

我在__init__.py 中尝试了from...import 的几种用法,但无济于事!这是我尝试在Project/package/__init__.py 中输入的内容的摘要,以及他们在尝试import package 时产生的错误:

from .b import Three, Four
#  ImportError: No module named 'package.b'  
---
from b import Three, Four
#  ImportError: No module named 'b'
---
from package.b import Three, Four
# ImportError: cannot import name Three

我以为我在上一个项目中已经解决了这个问题...(参见:this answer

TL;DR 我需要在Project/package/__init__.py 中添加什么,以便用户可以直接从我的包中导入类 3 和 4,而无需知道它们存在于哪个模块中?换句话说,我怎样才能扁平化模块b的命名空间?

编辑:使用 Python 3.3,但我可能会切换到 3.4,我可能还需要支持 2.7。

编辑:添加了一个 TL;DR

编辑:为了清晰起见,对问题进行了重大重新格式化

编辑:更新标题以反映清晰度:)

编辑:添加了对在这种情况下似乎不起作用的类似(已解决)问题的引用

【问题讨论】:

标签: python import structure packages importerror


【解决方案1】:

你不用点:就这么简单。

在 b.py 中:

from a import Three, Four

您的程序似乎正在寻找package.b,而不仅仅是b。这可能意味着使用 .不会工作

来自from .a import的输出

File "/storage/emulated/0/com.hipipal.qpyplus/scripts3/.last_tmp.py",   line 1, in <module>
from .a import One, Two
ValueError: Attempted relative import in non-package

from a import 的输出(预期)

1
2

【讨论】:

  • 如果有一个包叫a呢?
  • @rhgrant10 你必须重命名你的文件
  • @rhgrant 您使用的是哪个版本的 Python?
  • 更新了问题以指示 Python 版本 :-)
  • 问题是:我需要在其中放入什么,以便用户可以直接从我的包中导入类 3 和 4,而无需知道它们存在于哪个模块中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2013-03-24
相关资源
最近更新 更多