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等等.
让我们包的一个例子pkg带有两个模块a.py和b.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,我们能够将其作为属性访问pkg但b不存在,所以为了以后访问它我们应该使用:
>>> import pkg.b # OR: from pkg import b
Run Code Online (Sandbox Code Playgroud)
HTH,
| 归档时间: |
|
| 查看次数: |
7239 次 |
| 最近记录: |