仅导入特定名称

2024-03-29 06:48:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下包结构:

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。你知道吗

看看^{}他们设法实现了这一点,但没有显示他们在^{}中的所有numpy导入


Tags: 模块frompyimportpandasinitmainsave
3条回答

部分解决方案

将子模块嵌套到文件夹中,只导入__init__.py中所需的方法,即:

analysis/
         __init__.py
         main.py
         utils/
               __init__.py
 >            myzip/
                     __init__.py
                     myzip.py

其中myzip/__init__.py具有:

from .myzip import load, save

然后在from utils import myzip之后dir(myzip)将列出loadsavemyzip,而不是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 *操作的人可能会遇到与名称saveload的冲突。当涉及到星型导入名称冲突时,专门担心导入的模块名称是没有用的。你知道吗

另外,值得注意的是,许多广泛使用的库都以这种方式公开了自己的导入,这并不被认为是一个问题。熊猫本身就是一个例子:

>>> import pandas
>>> pandas.np
<module 'numpy' from '...'>

。如果你认为这不是问题的话,那么你是一个很好的伙伴。你知道吗

如果moduleB是在moduleA的模块级别导入的,则moduleBmoduleA命名空间的一部分。你知道吗

但是,隐藏它的一种方法是使用别名导入它:

import pandas as _hidden_pandas

然后它将显示为_hidden_pandas,在某种程度上隐藏了它。 标签完成至少找不到它。你知道吗

相关问题 更多 >