gpt4 book ai didi

Python 导入的细微差别

转载 作者:太空宇宙 更新时间:2023-11-03 11:06:15 24 4
gpt4 key购买 nike

有人可以阐明 Python 解释器中的这种行为吗:

from os import path    # success
type(path) # <class 'module'>
from path import * # complains that no module called 'path' exists

type(os.path) # complains that the name 'os' is not defined, yet:
from os.path import * # works just fine

作为附带问题,我想知道是什么机制允许诸如“from os import path”之类的语句起作用,而 os 仍然未定义? os 不是在 from...import 时执行的,因此它应该作为模块“已知”吗?我是否正确地说,将 os 排除在已知名称之外只是一种约定,旨在防止 namespace 被未直接导入的符号“污染”(如“import os”)?

最佳答案

这不是 Python 3 特有的,您在 Python 2 中也会遇到同样的问题。导入名称会将其添加到命名空间,仅此而已。

这一行:

from path import *

意思是:

"Try to find a module called path in any directory that is in PYTHONPATH, and attempt to import all names from it to the current namespace."

由于当前工作目录中没有这样的模块,更重要的是 PYTHONPATH 中的任何目录中都没有,因此导入失败。请注意,搜索不会搜索 PYTHONPATH 中任何目录的子目录

type(os.path)

此行失败,因为当前命名空间中没有名称 os(因为它未导入)。

I wonder what is the mechanism that allows a statement such as 'from os import path' to work, while yet still os is undefined?

导入会导致在 PYTHONPATH 中定义的路径中搜索模块;见this article on effbot有关导入工作原理的更多说明。

“未定义”仅表示该名称不存在于命名空间中。

Isn't os executed at the time of the from...import, and such it should be "known" as a module?

不,当你执行 from x import y 时,只有 y 被导入,而不是 x

Am I right to say that keeping os out of the known names is simply a convention, intended to prevent the "polution" of the namespace with symbols that have not been imported directly (as in 'import os')?

不,这不是真的(我希望你明白为什么)。

关于Python 导入的细微差别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18540466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com