`from ... import` 与 `import .` [重复]
- 2025-01-16 08:38:00
- admin 原创
- 11
问题描述:
我想知道代码片段之间是否有区别
from urllib import request
和片段
import urllib.request
或者它们是否可以互换。如果它们可以互换,那么“标准”/“首选”语法是什么(如果有的话)?
解决方案 1:
这取决于您在引用它时想要如何访问导入。
from urllib import request
# access request directly.
mine = request()
import urllib.request
# used as urllib.request
mine = urllib.request()
为了简单起见或避免掩盖内置函数,您还可以在导入时自己设置别名:
from os import open as open_
# lets you use os.open without destroying the
# built in open() which returns file handles.
解决方案 2:
很多人已经解释过import
vs 了from
,所以我想尝试更深入地解释一下,看看实际的区别在哪里。
首先,让我详细解释一下基本导入语句的作用。
import X
导入模块
X
,并在当前命名空间中创建对该模块的引用。然后,您需要定义完整的模块路径,以便从模块内部访问特定属性或方法(例如:X.name
或X.attribute
)
from X import *
导入模块
X
,并创建对当前命名空间中该模块定义的所有公共对象的引用(即,所有不以 开头的名称的对象_
)或您提到的任何名称。或者换句话说,运行此语句后,您可以简单地使用普通(非限定)名称来引用 module 中定义的内容
X
。但X
其本身未定义,因此X.name
不起作用。如果name
已定义,则将被新版本替换。如果 nameX
更改为指向其他对象,您的模块不会注意到。这使得模块中的所有名称都可以在本地命名空间中使用。
现在让我们看看当我们这样做时会发生什么import X.Y
:
>>> import sys
>>> import os.path
检查sys.modules
姓名os
和os.path
:
>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
检查名称空间字典globals()
并locals()
加上名称os
和os.path
:
>>> globals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> locals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> globals()['os.path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'os.path'
>>>
从上面的例子中,我们发现只有os
添加到本地和全局命名空间中。因此,我们应该能够使用os
:
>>> os
<module 'os' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> os.path
<module 'posixpath' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>
…但不是path
:
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
os
一旦从命名空间中删除locals()
,您将无法访问os
或os.path
,即使它们确实存在于sys.modules
:
>>> del locals()['os']
>>> os
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>> os.path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>
现在我们来看看from
。
from
>>> import sys
>>> from os import path
检查sys.modules
姓名os
和os.path
:
>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
因此sys.modules
看起来和我们使用导入时一样import name
。
好的。让我们检查一下它的命名空间字典是什么locals()
样子globals()
的:
>>> globals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> locals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['os']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'os'
>>>
您可以通过使用 来访问path
,但不能通过 来访问os.path
:
>>> path
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> os.path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>
让我们从 locals() 中删除“路径”:
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
最后再举一个使用别名的例子:
>>> from os import path as HELL_BOY
>>> locals()['HELL_BOY']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['HELL_BOY']
<module 'posixpath' from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>
并且没有定义路径:
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>
使用的一个陷阱from
当您从两个不同的模块导入相同的内容时name
:
>>> import sys
>>> from os import stat
>>> locals()['stat']
<built-in function stat>
>>>
>>> stat
<built-in function stat>
再次导入统计数据shutil
:
>>>
>>> from shutil import stat
>>> locals()['stat']
<module 'stat' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'>
>>> stat
<module 'stat' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'>
>>>
最后的进口将获胜
解决方案 3:
两者是有区别的。在某些情况下,其中一个会起作用,而另一个则不会。以下是一个例子:假设我们有以下结构:
foo.py
mylib\n a.py
b.py
现在,我想导入b.py
。a.py
我想导入a.py
。foo
我该怎么做?两个语句,a
我在 中写道:
import b
我写道foo.py
:
import mylib.a
那么,ImportError
在尝试运行 时,这将生成一个foo.py
。解释器将抱怨a.py
( import b
) 中的 import 语句,说没有模块 b。那么如何解决这个问题呢?在这种情况下,将 中的 import 语句更改a
为import mylib.b
将不起作用,因为a
和b
都在 中mylib
。这里的解决方案(或至少一个解决方案)是使用绝对导入:
from mylib import b
来源:Python:导入模块,导入模块
解决方案 4:
您使用的是 Python3 中的 urllib 包。两种形式都可以接受,并且没有哪种导入形式优于另一种。有时,当涉及多个包目录时,您可能使用前者from x.y.z.a import s
在使用 urllib 包的这个特殊情况下,第二种方式import urllib.request
和用法urllib.request
是标准库如何统一使用它。
解决方案 5:
在 Python 2.x 中至少你不能这样做import urllib2.urlopen
你必须做from urllib2 import urlopen
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib2.urlopen
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named urlopen
>>> import urllib.request
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named request
>>>
解决方案 6:
我对 import urllib.request 的主要抱怨是即使没有导入 urllib.parse 仍然可以引用它。
>>> import urllib3.request
>>> urllib3.logging
<module 'logging' from '/usr/lib/python2.7/logging/__init__.pyc'>
对我来说请求是在 urllib3 下。Python 2.7.4 ubuntu
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)