首页 > 解决方案 > 如何定义模块的导入?

问题描述

我有一个这样的目录结构:

└── stuff
    ├── __init__.py
    └── substuff
        ├── imp.py
        └── __init__.py

stuff/__init__.py如下所示:

from stuff.substuff.imp import foo, bar

像这样stuff/substuff/__init__.py

from stuff.substuff.imp import foo, bar

__all__ = [
    'foo',
    'bar'
]

stuff/substuff/imp.py包含

import pandas as pd
import numpy as np

__all__ = ['foo', 'bar']


def foo():
    return {'foo': np.sqrt(2)}


def bar():
    return ('bar', 'xyz')


def _helper():
    return True

如果我现在这样做

from stuff.substuff import imp

并检查可用于 的内容imp,我看到bar, foo,还有pdnp

我怎样才能实现用户只看到barandfoo而不是pdand np?一种解决方案似乎是将它们导入为_pdand _np,但我想知道是否有比这更“漂亮”的解决方案。

标签: pythonpython-3.x

解决方案


首先,请注意这__all__并不妨碍直接导入任何模块符号(函数、类等)。查看这篇精彩的文章了解更多详情。它仅设置行为from stuff.substuff.imp import *,而不是显式模块导入(文档)。

此语句只会导入foo,并且bar如您所料:

from stuff.substuff import *

此外,您已经限制了直接从substuffpackage 到fooand的导入bar

from stuff.substuff import foo  # successfully imported
from stuff.substuff import pd  # import error

推荐阅读