进口package.submodule有什么好处?

Bob*_*ver 2 python import packages python-import

使用numpy作为一个例子,我似乎无法实现什么做这样一个进口的好处将做到:

import numpy.lib
Run Code Online (Sandbox Code Playgroud)

导入完成后,numpy可以作为名称使用,相当于直接导入它:

import numpy
Run Code Online (Sandbox Code Playgroud)

这两种情况下,您lib只能使用虚线访问来访问子模块:

>>> numpy.lib
<module 'numpy.lib' from ....>
Run Code Online (Sandbox Code Playgroud)

是否存在做import numpy.lib有益的情况?

Ray*_*ger 5

摘要

实际效果取决于模块的实现方式.外部模块可能会也可能不会导入子包.有关详细信息,请参阅包的教程部分.

示例目录结构

例如,这是一个可能的目录结构

outer
??? outer/__init__.py
??? outer/inner
    ??? outer/inner/__init__.py
Run Code Online (Sandbox Code Playgroud)

外部/ __ init__.py为空的情况

>>> import outer               # only loads outer
>>> import outer.inner         # loads both outer and inner 
Run Code Online (Sandbox Code Playgroud)

外部/ __ init__.py加载子模块的情况

如果outer/__init__.py文件包含from . import inner,那么你得到:

>>> import outer               # loads both outer and inner
>>> import outer.inner         # loads both outer and inner 
Run Code Online (Sandbox Code Playgroud)

来自NumPy的具体案例

所述numpy的模块第二壳体相匹配,所以import numpyimport numpy.lib具有相同的效果.这是除了numpy的__init__.py文件之外:

from . import core
from .core import *
from . import compat
from . import lib
from .lib import *
from . import linalg
from . import fft
from . import polynomial
from . import random
from . import ctypeslib
from . import ma
from . import matrixlib as _mat
from .matrixlib import *
from .compat import long
Run Code Online (Sandbox Code Playgroud)

结论

在特定情况下numpy的,import numpyimport numpy.lib具有完全一样的效果.

希望能为你清除它:-)