我的包裹的制表符完成

时间:2018-09-06 20:57:21

标签: python package python-import pypi tab-completion

当我导入创建的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的制表符完成只是问题吗?

1 个答案:

答案 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"]