当我导入创建的Python 3软件包时,该软件包的制表符完成包括一些由我的软件包从其他软件包(例如pandas
)中导入的软件包。
该软件包具有以下基本结构:
foo/
foo/
__init__.py
bar.py
baz.py
qux.py
setup.py
我的__init__.py
包含
from .bar import *
from .baz import *
from .qux import *
问题是baz.py
看起来像这样
import pandas as pd
def f1(data):
# do something with pandas (pd)
def f2(data):
# do something different with pandas (pd)
因此,当我import foo
时,我会得到foo.pd
之类的制表符完成选项,这实际上不是有效的东西。对于所有foo.X
,我希望X
成为我定义的函数或类,而不是从另一个包中导入。
解决此问题的最佳方法是什么?我应该将import pandas as pd
添加到__init__.py
吗?我知道我可以在每个函数中import pandas as pd
进行操作,但是对于像这样的琐碎示例而言,这似乎有些过头了。
Jupyter的制表符完成只是问题吗?
答案 0 :(得分:0)
在__init__.py
中设置__all__
,以定义从模块中import *
时应公开的内容:
唯一的解决方案是让程序包作者提供程序包的显式索引。
import
语句使用以下约定:如果程序包的__init__.py
代码定义了名为__all__
的列表,则将其视为{{1}时应导入的模块名称的列表。 }。在发布新版本的软件包时,软件包作者有责任使此列表保持最新。
例如:
from package import *
或者,您可以names starting with _
won't be imported by default起__all__ = ["stuff", "you", "want", "to", "expose"]
。