我有以下包结构:
analysis/
__init__.py
main.py
utils/
__init__.py
myzip.py
myzip.py
包含以下内容:
import pandas
def save():
...
def load():
...
在我的main.py
脚本中:
from utils import myzip
当我键入myzip.<TAB>
或do dir(myzip)
时,导入的pandas
也会出现。是否可以避免显示子模块中导入的pandas
?是否有导入第三方模块的最佳实践?你知道吗
我尝试将以下内容添加到analysis/utils/__init__.py
:
from utils.myzip import save, load
但当I dir(myzip)
形成main.py
时,它仍然显示pandas
。你知道吗
部分解决方案
将子模块嵌套到文件夹中,只导入
__init__.py
中所需的方法,即:其中
myzip/__init__.py
具有:from .myzip import load, save
然后在
from utils import myzip
之后dir(myzip)
将列出load
、save
和myzip
,而不是pandas
,它隐藏在myzip.myzip.<TAB>
中。你知道吗还没有弄清楚
sklearn
如何隐藏第三方模块。你知道吗如this question中所述,可以导入别名以下划线开头的模块(例如
import pandas as _pandas
)。名称仍然可以作为myzip._pandas
使用,但是IPython tab completion不会自动完成它(除非您首先显式键入下划线)。另外,如果您执行from myzip import *
,它将不会被导入,尽管您无论如何都不应该这样做。你知道吗然而,正如在this other question中提到的,更好的“解决方案”就是不要担心它。如果有人做了
import myzip
,那么他们能够访问myzip.pandas
并没有什么坏处;这并不是说他们自己不能导入pandas
。另外,在这种情况下没有名称冲突的风险,因为pandas
在您的模块下有名称空间。唯一可能出现名称冲突的方法是,如果您的模块本身将名称pandas
用于两个不同的事情(例如,除了导入的模块之外,还定义了一个名为pandas
的全局变量);但这是模块内部的问题,无论pandas
是否可从外部访问。你知道吗如果有人拥有自己的变量
pandas
,然后执行from myzip import *
,则可能会出现名称冲突,但正是由于这个原因,不鼓励星型导入,并且导入模块的名称在这方面与其他名称没有区别。例如,执行from myzip import *
操作的人可能会遇到与名称save
或load
的冲突。当涉及到星型导入名称冲突时,专门担心导入的模块名称是没有用的。你知道吗另外,值得注意的是,许多广泛使用的库都以这种方式公开了自己的导入,这并不被认为是一个问题。熊猫本身就是一个例子:
。如果你认为这不是问题的话,那么你是一个很好的伙伴。你知道吗
如果
moduleB
是在moduleA
的模块级别导入的,则moduleB
是moduleA
命名空间的一部分。你知道吗但是,隐藏它的一种方法是使用别名导入它:
然后它将显示为
_hidden_pandas
,在某种程度上隐藏了它。 标签完成至少找不到它。你知道吗相关问题 更多 >
编程相关推荐