gpt4 book ai didi

python - 'import x' vs "' from x import y' and 'import x.y' "

转载 作者:太空宇宙 更新时间:2023-11-04 00:52:34 33 4
gpt4 key购买 nike

我试过了

from urllib import request 
mine = request.Request()

import urllib.request
mine = urllib.request.Request()

它们都工作正常。但是

import urllib
mine = urllib.request.Request()

给我

AttributeError: 'module' object has no attribute 'request' 

考虑到 request 是 urllib 的一个属性,它不应该也有效吗?如果不是,为什么前面的陈述有效?我正在使用 python 3.4.3。

最佳答案

Python 在导入包时,不会导入该包的所有内容 - 它会导入包的 __init__.py 文件的内容。 (或者,至少,看起来是这样。)

我刚刚用它做了一些测试,我发现了以下内容:

>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

如您所见,请求错误解析响应robotparser 不存在。 它只导入了 __init__.py 文件。

因此,为了进一步测试,我查看了 tkinter

这是 tkinter 的文件夹: tkinter's Folder

因此,为了验证最初只有 __init__.py 可访问的理论,这里有一些与 tkinter 相关的命令:

>>> import tkinter
>>> tkinter.font
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'tkinter' has no attribute 'font'
>>> tkinter.test
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'tkinter' has no attribute 'test'
>>> tkinter.test.support
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'tkinter' has no attribute 'test'
>>> dir(tkinter)
['ACTIVE', 'ALL', 'ANCHOR', 'ARC', 'BASELINE', 'BEVEL', 'BOTH', 'BOTTOM', 'BROWSE', 'BUTT', 'BaseWidget', 'BitmapImage', 'BooleanVar', 'Button', 'CASCADE', 'CENTER', 'CHAR', 'CHECKBUTTON', 'CHORD', 'COMMAND', 'CURRENT', 'CallWrapper', 'Canvas', 'Checkbutton', 'DISABLED', 'DOTBOX', 'DoubleVar', 'E', 'END', 'EW', 'EXCEPTION', 'EXTENDED', 'Entry', 'Event', 'FALSE', 'FIRST', 'FLAT', 'Frame', 'GROOVE', 'Grid', 'HIDDEN', 'HORIZONTAL', 'INSERT', 'INSIDE', 'Image', 'IntVar', 'LAST', 'LEFT', 'Label', 'LabelFrame', 'Listbox', 'MITER', 'MOVETO', 'MULTIPLE', 'Menu', 'Menubutton', 'Message', 'Misc', 'N', 'NE', 'NO', 'NONE', 'NORMAL', 'NS', 'NSEW', 'NUMERIC', 'NW', 'NoDefaultRoot', 'OFF', 'ON', 'OUTSIDE', 'OptionMenu', 'PAGES', 'PIESLICE', 'PROJECTING', 'Pack', 'PanedWindow', 'PhotoImage', 'Place', 'RADIOBUTTON', 'RAISED', 'READABLE', 'RIDGE', 'RIGHT', 'ROUND', 'Radiobutton', 'S', 'SCROLL', 'SE', 'SEL', 'SEL_FIRST', 'SEL_LAST', 'SEPARATOR', 'SINGLE', 'SOLID', 'SUNKEN', 'SW', 'Scale', 'Scrollbar', 'Spinbox', 'StringVar', 'TOP', 'TRUE', 'Tcl', 'TclError', 'TclVersion', 'Text', 'Tk', 'TkVersion', 'Toplevel', 'UNDERLINE', 'UNITS', 'VERTICAL', 'Variable', 'W', 'WORD', 'WRITABLE', 'Widget', 'Wm', 'X', 'XView', 'Y', 'YES', 'YView', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_cnfmerge', '_default_root', '_exit', '_flatten', '_join', '_magic_re', '_setit', '_space_re', '_splitdict', '_stringify', '_support_default_root', '_test', '_tkerror', '_tkinter', '_varnum', 'constants', 'getboolean', 'getdouble', 'getint', 'image_names', 'image_types', 'mainloop', 're', 'sys', 'wantobjects']

注意到 dir 响应中的 mainloop,我检查了 __init__.py - 果然,mainloop()在那里定义。

因此,在回答您的问题时,Python 仅在您执行 import urllib 时加载 urllib__init__.py 文件 - 而不是 request.py.

编辑: 作为另一点,在 dir(tkinter) 中,有一些变量定义在 tkinter.constants 中,而不是 __init__.py。这是因为在 tkinter__init__.py 中,它使用 from tkinter.constants import * 导入了 tkinter.constants .

关于python - 'import x' vs "' from x import y' and 'import x.y' ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36532334/

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