不同的导入语法不等价?

Different import syntaxes not equivalent?

我尝试了两种我认为相同的不同导入语法。奇怪的事情似乎接踵而至:

In [7]: import sympy

In [8]:sympy.physics.units.find_unit("Giga Electron Volt")
Traceback (most recent call last):

  File "<ipython-input-8-8a26ac4a085a>", line 1, in <module>
    sympy.physics.units.find_unit("Giga Electron Volt")

AttributeError: 'module' object has no attribute 'physics'


In [9]:import sympy.physics.units as u

In [10]:u.find_unit("coul")
Out[10]: ['coulomb', 'coulombs']

In [11]:import sympy

In [12]:sympy.physics.units.find_unit("coul")
Out[12]: ['coulomb', 'coulombs']

在这里查看sympy的源代码:https://github.com/sympy/sympy/blob/master/sympy/init.py#L55

from .calculus import *
# Adds about .04-.05 seconds of import time
# from combinatorics import *
# This module is slow to import:
#from physics import units
from .plotting import plot, textplot, plot_backends, plot_implicit

他们没有导入物理模块,因为加载显然需要相当长的时间。这就是您在第一次尝试时出错的原因。

手动加载后,解释器会加载它并知道它在哪里(从您的手动导入)。这就是它在第二次尝试时起作用的原因。

所以该现象不属于python导入功能,属于模块初始化

P.S。 如果您取消注释从物理模块加载 unit 的行,它将是

import sympy
sympy.units.find_unit("coul")