Python import语句语义

Tra*_*leu 15 python python-import

我很难理解import语句及其变体.

假设我正在使用该lxml模块来抓取网站.

以下示例显示......

from lxml.html import parse
parse( 'http://somesite' )
Run Code Online (Sandbox Code Playgroud)

... Google的python样式指南更喜欢基本的import语句,以保留名称空间.

我更喜欢这样做,但当我尝试这样做时:

import lxml
lxml.html.parse( 'http://somesite' )
Run Code Online (Sandbox Code Playgroud)

...然后我收到以下错误消息:

AttributeError:'module'对象没有属性'html'

任何人都可以帮我理解发生了什么吗?我更喜欢在其命名空间中使用模块,但需要一些帮助来理解语义.

unu*_*tbu 10

import lxml.html as LH
doc = LH.parse('http://somesite')
Run Code Online (Sandbox Code Playgroud)

lxml.html是一个模块.当您import lxml,html模块未导入lxml命名空间.这是开发人员的决定.有些软件包会自动导入某些模块,有些则不会.在这种情况下,你必须自己做import lxml.html.

import lxml.html as LH导入html模块并将其绑定到LH当前模块命名空间中的名称.所以你可以用它来访问解析函数LH.parse.


如果您想深入研究包lxml(如lxml.html)自动导入模块(如),请打开终端并键入

In [16]: import lxml

In [17]: lxml
Out[17]: <module 'lxml' from '/usr/lib/python2.7/dist-packages/lxml/__init__.pyc'>
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到lxml__init__.py文件的路径.如果你查看你发现的内容是空的.因此不会导入任何子模块.如果你看看numpy的__init__.py,你会看到很多代码,其中包括

import linalg
import fft
import polynomial
import random
import ctypeslib
import ma
Run Code Online (Sandbox Code Playgroud)

这些都是导入numpy命名空间的子模块.因此,从用户的角度来看,import numpy会自动让你访问numpy.linalg,numpy.fft等等.


mou*_*uad 6

让我们包的一个例子pkg带有两个模块a.pyb.py:

--pkg
   |
   | -- a.py
   |
   | -- b.py
   |
   | -- __init__.py
Run Code Online (Sandbox Code Playgroud)

__init__.py你进口a.py不是 b.py:

进口一个

所以如果你打开你的终端并做:

>>> import pkg
>>> pkg.a
>>> pkg.b
AttributeError: 'module' object has no attribute 'b'
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,因为我们已经a.py在pkg中导入了__init__.py,我们能够将其作为属性访问pkgb不存在,所以为了以后访问它我们应该使用:

>>> import pkg.b   # OR: from pkg import b
Run Code Online (Sandbox Code Playgroud)

HTH,