【问题标题】:Python package structure supporting * imports支持 * 导入的 Python 包结构
【发布时间】:2014-04-21 23:41:03
【问题描述】:

我正在重组一个 python 项目,该项目是从一小部分脚本演变而来的。我之前没有考虑过正确的包结构,所以所有脚本都位于包根目录中。

我正在尝试为项目提供一个适当的“包”结构,如下所示:

packagename/
    docs/
    packagename/
        __init__.py
        module_data.py
        module_corrections.py
        module_plot.py
        subpackage1/
        subpackage2/
    README.md

我想支持将包导入为:

from packagename import *

之前导入的效果应该是加载了几个子模块或子包,还有一些我想提供的类和函数,不加模块名。

__init__.py 中使用__all__ 我只能加载子模块或子包。

如何加载,例如来自module_dataData() 类和来自模块module_plot 的函数dplot

此外,如何使用另一个短名称(例如 mda)导入 module_data

编辑

简答

我要提供的所有名称必须在__init__.py中导入或定义 作为字符串添加到列表__all__

感谢@FMc 提供示例和见解。

【问题讨论】:

  • 仅供参考 from foo import * 通常是不好的做法 - 请参阅 PEP-008
  • 当一个程序使用一个包时,我同意。但是在运行交互式会话时,我希望能够节省额外的输入:“实用性胜过纯度”。

标签: python package project python-import


【解决方案1】:

这是一个示例 -- 但是,作为一般规则,您不应使用通配符导入(仅在狭义的情况下,并且仅当您定义 __all__ 时)。

# Directory structure.
.
├── foopack/
│   ├── __init__.py
│   ├── data.py
│   └── plot.py
└── run.py

# foopack/data.py
class Data(object):
    def blah(self):
        print self.x

# foopack/plot.py
def dplot():
    print 'dplot()'

# foopack/__init__.py
# Here we use relative imports and define __all__.
from .data import Data
from .plot import dplot    
__all__ = 'Data dplot'.split()

# A demo script: demo.py
from foopack import *

d = Data()
d.x = 32
d.blah()
dplot()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-07-26
  • 2022-01-17
  • 2021-05-01
  • 2023-03-07
  • 1970-01-01
  • 2011-07-07
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多