为了账号安全,请及时绑定邮箱和手机立即绑定

`from ... import` vs`import。`

/ 猿问

`from ... import` vs`import。`

明月笑刀无情 2019-08-14 17:42:08

`from ... import` vs`import。`

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

from urllib import request

和片段

import urllib.request

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

谢谢!


查看完整描述

3 回答

?
慕桂英4014372

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

from urllib import request# access request directly.mine = request()import urllib.request# used as urllib.requestmine = urllib.request()

为简单起见,您还可以在导入时自己为别名设置别名,或者避免屏蔽内置插件:

from os import open as open_# lets you use os.open without destroying the # built in open() which returns file handles.


查看完整回答
反对 回复 2019-08-14
?
潇潇雨雨

很多人已经解释过importvs from,所以我想尝试更多地解释一下,实际的差异在于。

首先,让我准确解释一下基本的import语句。

import X

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

from X import *

导入模块X,并创建对当前命名空间中该模块定义的所有公共对象的引用(即,没有名称的所有公共对象_)或您提到的任何名称。

或者,换句话说,在运行此语句之后,您可以简单地使用普通(非限定)名称来引用模块中定义的内容X。但是X它本身没有定义,所以X.name不起作用。如果name 已经定义,它将被新版本替换。如果将name in X更改为指向其他某个对象,则您的模块将不会注意到。

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

现在让我们看看当我们这样做时会发生什么import X.Y

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

检查sys.modules姓名osos.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()命名空间dict的名称osos.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

>>> pathTraceback (most recent call last):
  File "<stdin>", line 1, in <module>NameError: name 'path' is not defined 
>>>

删除osfrom locals()命名空间后,您将无法访问os或者os.path,即使它们确实存在于sys.modules

>>> del locals()['os']>>> osTraceback (most recent call last):
  File "<stdin>", line 1, in <module>NameError: name 'os' is not defined>>> os.pathTraceback (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姓名osos.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.pathTraceback (most recent call last):
  File "<stdin>", line 1, in <module>NameError: name 'os' is not defined>>>

让我们从locals()中删除'path':

>>> del locals()['path']>>> pathTraceback (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'>>>>

最后的进口将赢得胜利


查看完整回答
反对 回复 2019-08-14
?
翻翻过去那场雪

它们是有区别的。在某些情况下,其中一个将起作用,另一个则不起作用。这是一个例子:说我们有以下结构:

foo.py
mylib\
    a.py
    b.py

现在,我想导入b.pya.py。我想导入a.pyfoo。我该怎么做呢?a我写的两个陈述:

import b

foo.py我写:

import mylib.a

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

from mylib import b


查看完整回答
反对 回复 2019-08-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信