'.'有什么用?在 python 个导入语句中
What's the use of '.' in python import statements
from math import floor
和 import 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 属性并且工作正常。
from math import floor
和 import 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 属性并且工作正常。