Python导入语句中包名前三点(Ellipsis)的作用是什么?
首先得澄清:导入代码里的...并不是Python里的Ellipsis对象(即单独写的...常量),它是相对导入的层级标记,用来指定从当前模块所在目录向上回溯的层级数,具体规则如下:
单一点
.:代表当前模块所在的包目录
比如你提供的sklearn示例里的from .base import _get_response,就是从当前文件(det_curve.py)所在的sklearn/metrics/_plot/目录下的base.py文件,导入_get_response函数。两个点
..:代表向上回溯一级目录
示例中的from .. import det_curve,就是从当前目录的上一级(sklearn/metrics/)导入det_curve模块;from .._base import _check_pos_label_consistency则是从上级目录的_base.py文件里导入对应函数。三个点
...:代表向上回溯两级目录
比如from ...utils import check_matplotlib_support,当前文件在sklearn/metrics/_plot/,向上回溯两级就到了sklearn/根目录,然后从sklearn/utils/模块里导入check_matplotlib_support工具函数。
至于GitHub Issue里的例子:
from ... import MyContentContentType as __MyContentContentType__ from ... import MyDetectionDetectionGender as __MyDetectionDetectionGender__
这里的...同样是向上回溯两级目录,从那个层级的包中导入指定的类,并且给它们设置了别名,方便在当前模块中使用。
最后要注意:这种带点的相对导入只能在包内部的模块中使用,如果在直接运行的顶级脚本(比如直接python test.py运行的文件)里用,会触发导入错误。
内容的提问来源于stack exchange,提问作者KiriSakow

