Python(3.3)包是如何工作的?

2024-04-20 07:43:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.3,在Windows上进行测试。我不明白什么。为什么我这么做:

>>> import urllib

我弄错了

^{pr2}$

以及

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

没有请求,所以看起来很可靠。但是,导入子模块请求时:

>>> import urllib.request

似乎有用

>>> urllib.request
<module 'urllib.request' from 'C:\\Python33\\lib\\urllib\\request.py'>

现在自动dir(urllib)显示:

>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', 
 '__loader__', '__name__', '__package__', '__path__', 'error', 'parse', 
 'request', 'response']

为什么我看不到import urllib所有子模块之后?根据http://docs.python.org/3.3/library/urllib.html#urllib.urlopen,它应该是requesterrorparseparserobots。其他操作系统有什么不同吗?在


Tags: 模块pathnameimportpackagedocrequestdir
3条回答

当你在的时候

>>> import package
>>> package.something

您真正要做的是查找在package/__init__.py中定义的名称something。所以,如果有人明确地把名字写在那里,你就可以使用它。否则你不能

以Python web.py库为例(github)。你可以的

^{pr2}$

之所以在这里,是因为在web/__init__.py中有一个显式的import httpserver或类似的语句。在

实际上这不是python3的问题。在Python3中遇到它是因为它使用标准库的包,而不仅仅是像Python2这样的普通模块。由于某些原因,urllib/__init__.pycurrently empty,所以您需要显式地import精确的模块,比如request来使用它们。对于一些标准包python3import对应的__init__.py文件中的一些“子模块”。也许只是为了向后兼容。在

另一个问题是为什么在import urllib.request之后,dir(urllib)会显示其他模块,比如response。看起来urllib.request内部使用的同一个包中的所有模块在import之后都将可用。如果你只是import urllib.error你就得不到{},因为error没有使用它。如果您检查Python导入系统的源代码,所有这些都会变得更容易理解—它充满了副作用(例如,使用global sys.modules字典“缓存”导入的模块)。在

urllib是一个包。导入包不会自动导入包中包含的模块;您需要显式导入urllib.request模块。在

让我们看看^{}。{it在模块中定义为的模块名。request未在urllibs__init__中定义,因此不会列出它。在

现在,对于“包如何工作”来说,包是某种基于目录的模块。它是从其__init__.py加载的,但允许子模块和子包(与__init__位于同一目录中的文件和目录)。{g{2>当你把所有的文件都加载到cd4}和它的类的初始值时,你就把它看作是

与类的比较非常好——当您创建对象时,只调用它的__init__,方法,而不是它的所有属性(方法也是属性)。此外,属性可以是函数或字段。字段也可以有属性。澄清:

  • __init__.py用于包,而__init__用于对象

  • 子模块对于包的作用与方法(函数属性)对于对象的意义一样

  • 子包对于包就像字段(非函数属性)对于对象一样。

为什么?__init__负责设置对象,子模块/方法是在一个地方存储逻辑的方法,子包/字段是组织其他子模块/方法或子子包/字段的方法。在

坦率地说:在CPython实现中,它的工作方式不是这样的,但是对于理解它的行为,它是一个非常好的模型。在

相关问题 更多 >