27

我在一个包(一种工具包)中有几个模块,我在我的项目中使用它们。结构如下所示:

the_toolkit:
    __init__.py
    basic_io.py
    simple_math.py
    matrix_kit.py
    ...

现在,当我从包中导入模块后使用IPython或代码完成时VIM

from the_toolkit import matrix_kit

我得到了一堆matrix_kit.py导入的模块/函数(arraymathloglogginformat_exc等),以及matrix_kit定义的实际函数。math由于我对模块的代码完成不感兴趣或array对模块的代码完成不感兴趣,我该如何过滤掉其他所有内容matrix_kit

正如许多pythonistas所建议的__init__.py那样,它是空的,还是这样做的方式?

4

4 回答 4

26

我遇到了同样的问题,并通过在所有导入中添加前导下划线来解决它。它看起来并不出色,但它实现了你所追求的。

from __future__ import division as _division
import numpy as _np
import pandas as _pd

当您使用 from .. import * 导入模块时,只会导入不带下划线开头的内容。或者当您在 IPython 或 spyder 中使用制表符完成时。

于 2014-03-13T12:48:57.490 回答
14

我开始喜欢并使用这种方法。从您的项目结构开始,我们将隐藏matrix_kit您不想显示的所有内容。

the_toolkit:
    __init__.py
    basic_io.py
    simple_math.py
    matrix_kit.py
    ...

移入matrix_kit.py同名包,并在模块名称的开头放置一个下划线:

the_toolkit:
    __init__.py
    basic_io.py
    simple_math.py
    matrix_kit:
        __init__.py
        _matrix_kit.py
    ...

现在_matrix_kit.py添加一个全局变量__all__ = [...],列出您希望可见的所有函数/类/变量的名称。然后,将以下行添加到matrix_kit/__init__.py

from ._matrix_kit import *

它只会导入__all__模块属性中列出的东西。然后,在matrix_kit像以前一样导入时,您将实际导入__init__.py及其内容。

于 2016-08-04T16:51:16.137 回答
0

我想出的另一种解决方案是在__init__文件中实现一个简短的 API 类,该类可以利用__all__变量(可能已经为import *目的而定义)。像这样的东西__init__.py

import matrix_kit

class _matrix_kit_API:
    def __init__(self):
        for func in matrix_kit.__all__:
            setattr(self, func, eval(f"matrix_kit.{func}"))

matrix_kit = _matrix_kit_API()
于 2020-08-12T16:22:33.043 回答
-1

你可能会得到一些里程__all__

于 2013-05-12T15:45:08.490 回答