我在一个包中有一些模块(一种工具包),我在我的项目中使用它。结构如下所示:
the_toolkit:
__init__.py
basic_io.py
simple_math.py
matrix_kit.py
...
现在,当我使用
从包导入模块后,IPython
或VIM
中的代码完成时
from the_toolkit import matrix_kit
我得到了一大堆matrix_kit.py
导入的模块/函数(array
,math
,log
,loggin
,format_exc
等。),以及matrix_kit
定义的实际函数。
我如何过滤掉其他所有内容,因为我对math
模块的代码完成中的array
或matrix_kit
不感兴趣?
许多pythonistas建议__init__.py
是空的,还是这样做?
答案 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()