“从…Import '和' Import '

我想知道代码片段之间是否有任何区别

from urllib import request

这个片段

import urllib.request

或者它们是否可以互换。如果它们是可互换的,那么哪个是“标准”/“首选”;语法(如果有的话)?

517261 次浏览

这取决于您在引用导入时希望如何访问它。

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.

你在包中使用的是Python3 urllib。两种形式都是可以接受的,没有一种形式的导入优于另一种。有时,当涉及多个包目录时,你可以使用前者from x.y.z.a import s

在urllib包的这种特殊情况下,import urllib.requesturllib.request的使用是标准库统一使用它的方式。

在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
>>>

这是有区别的。在某些情况下,其中一种可行,另一种行不通。这里有一个例子:假设我们有以下结构:

foo.py
mylib\
a.py
b.py

现在,我想将b.py导入a.py。我想导入a.pyfoo。我怎么做呢?在a中有两条语句:

import b

foo.py中我写:

import mylib.a
好吧,这将在试图运行foo.py时生成ImportError。解释器会抱怨a.py (import b)中的import语句说没有模块b。那么如何修复这个问题呢?在这种情况下,将a中的import语句更改为import mylib.b 将不能工作,因为ab都在mylib中。这里的解决方案(或至少一个解决方案)是使用绝对导入:

from mylib import b

来源:Python:导入导入模块的模块

我对import urllib的主要不满。请求是你仍然可以引用urllib。即使没有导入也要解析。

>>> import urllib3.request
>>> urllib3.logging
<module 'logging' from '/usr/lib/python2.7/logging/__init__.pyc'>

urllib3下也有我的请求。Python 2.7.4 ubuntu

许多人已经解释了importfrom,所以我想试着解释更多一点,真正的区别在哪里。

首先,让我解释一下基本的import语句是做什么的。

import X

导入模块X,并在类中创建对该模块的引用 当前的名称空间。然后需要定义完成的模块路径 从模块内部访问一个特定的属性或方法(例如: X.name or X.attribute)

from X import *

导入模块X,并创建对所有公共对象的引用 由当前名称空间中的模块定义(即所有内容) 没有以_开头的名称)或任何名称 你提到。< / p > 或者,换句话说,在运行这条语句之后,您可以简单地 使用一个普通的(非限定的)名称来引用模块X中定义的东西。 但是X本身没有定义,所以X.name不起作用。如果name 已定义,则由新版本替换。如果name in X为 更改为指向其他对象,您的模块将不会注意到

这使得模块中的所有名称在本地名称空间中都可用。

现在让我们看看执行import X.Y时会发生什么:

>>> import sys
>>> import os.path

用名字osos.path检查sys.modules:

>>> 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'>

检查名称为osos.pathglobals()locals()命名空间字典:

 >>> 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
>>>

一旦你从locals()命名空间中删除了os,你将无法访问osos.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

用名字osos.path检查sys.modules:

>>> 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()中删除'path':

>>> 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导入stat:

>>>
>>> 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'>
>>>

最后一个导入将获胜