首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >支持*导入的Python包结构

支持*导入的Python包结构
EN

Stack Overflow用户
提问于 2014-04-20 22:00:10
回答 1查看 85关注 0票数 2

我正在重组一个python项目,它是从一些更大的脚本中演化而来的。我以前没有想过一个合适的包结构,所以所有的脚本都位于包根dir中。

我试图给这个项目一个适当的“包”结构,如下所示:

代码语言:javascript
复制
packagename/
    docs/
    packagename/
        __init__.py
        module_data.py
        module_corrections.py
        module_plot.py
        subpackage1/
        subpackage2/
    README.md

我希望支持将该一揽子方案导入如下:

代码语言:javascript
复制
from packagename import *

上一次导入的效果应该是加载几个子模块或子包,但也要加载一些类和函数,我想在没有预置模块名称的情况下提供这些类和函数。

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

如何加载,例如从module_data加载一个module_data类和从模块module_plot加载一个函数dplot

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

编辑

简短回答

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

感谢@FMc提供了一个例子和洞察力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-20 23:32:33

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

代码语言:javascript
复制
# 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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23188047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档