Python 仅使模块中的特定符号可导入,f.i.和`\u all__` tl;博士:

Python 仅使模块中的特定符号可导入,f.i.和`\u all__` tl;博士:,python,python-import,Python,Python Import,我喜欢干净的API,因此我不喜欢在模块API中显示“内部”导入,比如import numpy as np 在我的软件包(可使用setup.py安装)中,我有几个子模块,每个子模块导入一组模块,f.I.numpy或内置模块,如sys 假设在我的包mytools中有一个子模块mytools.mysubtools,我在其中定义了一个函数foo,它需要numpy(使用import numpy作为np导入)foo被添加到\uuuu all\uuuu=['foo'] 现在我使用import mytools.

我喜欢干净的API,因此我不喜欢在模块API中显示“内部”导入,比如
import numpy as np

在我的软件包(可使用setup.py安装)中,我有几个子模块,每个子模块导入一组模块,f.I.
numpy
或内置模块,如
sys

假设在我的包
mytools
中有一个子模块
mytools.mysubtools
,我在其中定义了一个函数
foo
,它需要
numpy
(使用
import numpy作为np
导入)
foo
被添加到
\uuuu all\uuuu=['foo']


现在我使用
import mytools.mysubtools作为mst
导入此子模块。当使用代码完成功能访问
mst
时(例如使用Spyder IDE、PyCharm、Kite等),它总是显示所有符号导入
mst
,在这种情况下
foo
np

我是否可以避免在导入的模块中显示像
np
这样的导入,从而只显示
foo

详细说明 假设我的包结构如下所示:

/mytools/
 |-- __init__.py  # "mytools-init"
 |-- my_subtools.py
 |-- some_other_subtools.py
from . import my_subtools as mysubtools
__all__ = ['mysubtools']
\uuuu init\uuuu.py
文件如下所示:

/mytools/
 |-- __init__.py  # "mytools-init"
 |-- my_subtools.py
 |-- some_other_subtools.py
from . import my_subtools as mysubtools
__all__ = ['mysubtools']
my_subtools.py

import numpy as np

__all__ = ['foo']

def foo():
    return np.sqrt(4**3)
现在我用

import mytools.mysubtools as mst
使用导入的模块时,代码完成等在键入
mst.
时始终显示
np
foo
,f.i。对于具有许多导入和/或函数/类定义的较大模块,这使得使用代码完成变得非常困难,因为对API的简单检查显示所有导入的模块和所有定义

使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
是否也可以以某种方式用于损坏显式导入

或者是否有任何建议的方法可以避免导入模块的所有符号?
对于函数,我使用name mangling,f.I.
def_baz():return 4**4

但这是否也适用于进口商品,f.i.
进口numpy as _np
?有什么缺点吗

我在找什么:
显式解决方案,因为:显式优于隐式。

例如,类似于
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。或者类似于
\uuuu的东西,除了从导入中排除符号的\uuuu=['np']

\uuuuuuuu all\uuuu=[…]
是“可导出”名称的一个很好的提示,但它只是一个提示。(不过,一些IDE,如PyCharm,确实倾向于获得线索。)

我绝对不会将numpy作为np导入
;你只会让你的生活更艰难


你不能阻止某人从你的模块导入东西,如果他们在那里。。。如果你真的想,你当然可以用咒语对所有模块进行后缀,比如
delnp,sys,os,qux,bar
;这样那些名字就不重要了,但是。。。我真的觉得不值得这么做。

感谢@chepner的评论,我一直在研究python标准库中的链接实现

结论是,标准库中经常使用导入模块的名称损坏。在我看来,这是一个非常明显的迹象,表明这被认为是肾盂性的和/或没有严重的缺点。
可以找到几个名称损坏导入的示例,f.i.:

哪些模块名称被损坏似乎会随着文件的不同而变化。似乎模块越“与系统相关”,其名称被篡改的可能性就越小。比如像

import re as _re
import math as _math

经常出现名称错误,而
将操作系统作为导入操作系统
则不太常见。这只是我的印象,所以一般来说可能不是这样。

“当使用代码补全等方式访问
mst
时,它总是在mst中显示所有符号和导入,在本例中为foo和np。”Python本身没有代码补全。什么是“它”?你是对的。当然,我说的是Spyder、PyCharm等编辑器的代码完成,这不仅仅是一个提示。它定义了foo import*
含义。另外,
import foo as\u foo
是一个常用的习惯用法,用于标准库本身(例如),感谢您的帮助!我希望有一些明确的风格,比如专门用于显式导入的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。它明确地提到,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>未定义时,模块的公共接口中不包括前缀名称(当然,当定义了
\uuuu!阅读文档中的“这是为了避免意外导出不属于API的项(例如导入并在模块中使用的库模块)。”这句话让人感觉它们暗中鼓励用户在导入时也使用名称篡改(至少从API的整体角度来看是这样的)。。。