- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有人可以阐明 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/
我是一名优秀的程序员,十分优秀!