'.'有什么用?在 python 个导入语句中

What's the use of '.' in python import statements

from math import floorimport math.floor 有什么区别?

from math import floor - 完美运行。

import math.floor - 无效。

我假设 . 用于引用文件,而 floor 不是文件,它只是 math?[=18 中的 class =]

from math import floor 允许您在代码中仅使用“floor”,但 import math.floor 意味着您必须在任何时候使用“math.floor”。

`from ... import` vs `import .`

编辑:为了更彻底地回答您的问题,math.floor 不起作用的原因是因为正如之前的评论所述,它是一个函数,而不是一个子模块。事实上,math 没有任何子模块,所以即使 math.* 也会给出同样的错误。

为了帮助解释这一点,我们将使用 dir() 函数:通过具体示例。以及如何自己检查这些。

导入语句中的'.'有什么用?
'.' 完全按照字面意思设置导入搜索的父目录。
这是为包保留的,与 '__path__ ' 属性的使用有关。

你可以这样自己检查。让我们继续导入 numpy 和数学:

import numpy, math
print(dir(numpy)) 

并查找 '__path__' 属性以确定某物是否为包:查找 '__path__' 你知道 numpy 是一个包。

为什么尝试 import math.floor 时不起作用?

首先,我们需要了解 import "whatever" 搜索的内容和方式。
为简单起见,您可以想到:
import whatever = 查找“whatever”,如果找到:在“whatever”中查找 '__name__' ,如果 '__name__' 不在“whatever”中,则引发错误 ModuleNotFound

我们来看看import math:
python 将搜索 math,一旦找到,将在 math 中搜索其 '__name__' 属性,因为这是 import 用来解析其指针赋值的内容(这是相关的,但与此解释无关)。

您可以使用:

print(dir(math))

并查找 '__name__' 属性以检查某物是否是模块:查找 '__name__'属性,你知道数学是一个模块。

如果你想尝试

print(dir(math.floor))

你不会找到 '__name__' 因为 floor 不是模块并且不能被 python import math.floor import floor

因此,当您尝试 import math.floor(将 math 指定为父目录是无关紧要的)。
python 将寻找数学;查找数学,python 将在数学中搜索 floor;查找楼层,python 将搜索楼层的 '__name__ ' 属性;并且无法找到 '__name__' 属性,它将引发错误 ModuleNotFound。

使用 from 改变搜索模式,使其成为查找 (module, attribute - '__specific__') 而不是 (module, attribute - ' __name__')
from math import floor 的情况下,这意味着 python 将搜索 math 的 '__floor__' 属性'而不是 数学的 '__name__'属性。它会在数学中找到 floor 属性并且工作正常。