【问题标题】:Import classes in subpackages into main namespace with Python package使用 Python 包将子包中的类导入主命名空间
【发布时间】:2011-06-26 18:01:22
【问题描述】:

我正在尝试将我的代码库重新组织成一个合适的 Python 包(带有子包),以便上传到 PyPI。我有以下目录(用于测试):

Py6S/
    __init__.py
    test.py
    Params/
          __init__.py
          AeroModel.py

AeroModel.py 包含:

class AeroModel:
    NO_AEROSOL=0
    CONTINENTAL=1
    MARITIME=2
    URBAN=3
    USER=4
    DESERT=5
    BIOMASS_BURNING=6
    STRATOSPHERIC=7

Py6S init.py 包含:

__all__ = ["Params"]

参数 init.py 包含:

__all__ = ["AtmosModel", "AeroModel", "AtmosCorr"]

但是,当我执行 from Py6S import * 时,我得到了可供参考的参数,但不是 AtmosModel 或 AeroModel。

我希望能够输入 from Py6S import * 并获得所有可用的 AeroModel、AtmosModel、AtmosCorr 等,而无需在它们前面放置任何模块名称。

【问题讨论】:

  • 我建议您不要为模块及其类赋予相同的名称,因为这会造成轻微的混淆。使用小写字母作为模块名称 (PEP 8)。因此,在您的情况下,它应该是包含类 AeroModelaeromodel.py 模块
  • @Guanidene - 谢谢。这是否有助于为我在下面的答案中发表的评论提供一些解决方案?我希望能够轻松导入 AeroModel 类。

标签: python packages


【解决方案1】:

如果 Py6S 的 __init__.pyfrom Params import *: 你需要这样做:

import Params
__all__ = ["Params"]
from Params import *
__all__ += Params.__all__

将这些添加到 Py6S 的 __all__

【讨论】:

  • 您真的需要from Params import * 才能访问Params.__all__吗?
  • 不,但如果您在当前命名空间中的Params 中列出的名称是什么,则需要它。
  • @Dan - 这很适合导入 AeroModel、AtmosModel 等模块 - 谢谢。但是,一旦我运行了from Py6S import *,我必须将 AeroModel 类(AeroModel 模块中的唯一类)引用为AeroModel.AeroModel。有没有办法让 class 被导入而不仅仅是模块?
  • @robintw - 您需要将文件夹 Params 中的 __init__.py 修改为此 - from aeromodel import Aeromodel; __all__ = ["atmosmodel", "aeromodel", "atmoscorr", "Aeromodel"]
  • @robintw - 在我之前的评论中,为了避免混淆,我用小写字母(以及大写字母中的类名)编写了模块名称。
猜你喜欢
  • 2019-03-28
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2023-03-25
  • 2011-02-26
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多