导入模块时隐藏外部模块(例如,关于代码完成)

时间:2013-05-12 15:37:45

标签: python code-completion python-import

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

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

现在,当我使用

从包导入模块后,IPythonVIM中的代码完成时
from the_toolkit import matrix_kit

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

许多pythonistas建议__init__.py是空的,还是这样做?

4 个答案:

答案 0 :(得分:17)

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

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

使用from .. import *导入模块时,仅导入没有下划线的内容。或者在IPython或spyder中使用制表符完成时。

答案 1 :(得分:5)

我喜欢并使用这种方法。从您的项目结构开始,我们将隐藏您不想显示的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及其内容。

答案 2 :(得分:0)

你可能会从__all__

中获得一些里程数

答案 3 :(得分: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()