《深入理解Python》读书笔记Ⅴ

本文介绍了Python中的网络编程基础知识,包括使用urllib和urllib2库进行HTTP资源获取的方法,利用SOAPpy库调用SOAP Web服务的过程,以及如何编写单元测试确保代码质量。此外,还涉及到了一些常用的操作系统路径处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、urllib 依赖于另一个 Python 的标准库,httplib。通常不必显式地给出 import httplib (urllib 会自动导入),但是可以为 HTTPConnection 类 (urllib 在内部使用它来访问 HTTP 服务器) 设置调试标记。

 import httplib

 httplib.HTTPCon nection.debuglevel = 1


2、使用 urllib2 获取 HTTP 资源包括三个处理步骤:

第一步是创建 Request 对象,它接受一个最终想要获取资源的URL。注意这一步实际上还不能获取任何东西。

第二步是创建一个 URL 开启器 (opener)。它可以接受任何数量的处理器来控制响应的处理。但也可以创建一个没有任何自定义处理器的开启器。

最后一个步骤是,使用创建的 Request 对象告诉开启器打开URL。因为能从获得的信息中看到所有调试信息,这个步骤实际上获得了资源并且把返回数据存储起来。


3、使用 Request 对象的 add_header 方法,能向请求中添加任意的 HTTP 头信息。第一个参数是头信息,第二个参数是头信息的值。


4、urlparse 是一个解析 URL 的便捷的工具模块。它的主要函数也叫 urlparse,接受一个 URL 并将其拆分为 tuple (scheme (协议), domain (域名), path (路径), params (参数), query string parameters (请求字符串参数), fragment identifier (片段效验符))。


5、“RPC-style” SOAP――调用远程函数获得返回结果。


6、使用SOAP web服务之前,需要先安装三个库:PyXML、fpconst 和SOAPpy。


7、通过 SOAPProxy  这个代理 (proxy) 类访问远程 SOAP 服务器。这个代理处理了所有的 SOAP 内部事务,其中包括:根据函数名和参数列表创建 XML请求文档,并将这个请求文档通过 HTTP 发送到远程 SOAP 服务器;解析XML 返回文档,并创建本地的 Python 返回值。

每个 SOAP 服务都有一个 URL 用以处理所有请求。每个SOAP 服务都有一个命名空间 (namespace),这个命名空间是由服务器任意命名的。

from SO APpy import SOAPProxy           
url = 'http://s ervices.xmethods.net:80/so ap/s ervlet/rpcrouter'
namespace = 'urn:xmethods-Temperatu re'  
server = SOAPProxy(ur l, nam espace)     
server.getTemp('27502')                #像调用本地函数一样调用远程 SOAP 方法


8、WSDL 是 “网络服务描述语言(Web ServicesDescription Language)”的缩写。它尽管是为自如地表述多种类型的网络服务而设定,却也经常用于描述 SOAP 网络服务。一个 WSDL 文件不过就是一个文件。更具体地讲,是一个 XML 文件。通常存储于所访问的 SOAP 网络服务这个被描述对象所在的服务器上。

在 WSDL 文件中描述了调用相应的 SOAP 网络服务的一切:
• 服务 URL 和命名空间
• 网络服务的类型 (可能是 SOAP 的函数调用,WSDL 足够自如地去描述网络服务的广泛内容)
• 有效函数列表
• 每个函数的参数
• 每个参数的类型
• 每个函数的返回值及其数据类型

 from SO APpy import WSDL         
wsdlFile = 'http://ww w.xmethods.net/sd/2001/Te mperatureService.wsdl'
server = WSDL.Proxy(wsd lFile)    
server.methods.keys() 

SOAPpy 包含一个 WSDL 解析器。WSDL.Proxy,它只需一个参数:WSDL 文件。WSDLproxy 类通过 Python 字典 server.methods 揭示有效函数,列出有效方法只需调用字典方法 keys()。server.methods 字典中记录一个 SOAPpy 的特别结构,被称为 CallInfo。CallInfo对象中包含着特定函数和函数参数的信息。函数参数信息存储在callInfo.inparams  中,这是一个记录每一个参数信息的ParameterInfo 对象的 Python 列表。每个 ParameterInfo 对象包含一个 name 属性,这便是参数名。与揭示函数参数的 callInfo.inparams  对应的是揭示返回值的callInfo.outparams。ParameterInfo 对象包含 name 和 type。


9、编写测试用例的第一步就是继承 unittest 模块中的 TestCase 类,它提供了很多可以用在测试用例中来测试特定情况的有用方法。每个独立测试本身都是一个方法,既不需要参数也不返回任何值。如果测试该方法正常退出没有引发异常,测试被认为通过;如果测试引发异常,测试被认为失败。

unittest 模块中的 TestCase 类提供了 assertRaises 方法,它接受这几个参数:预期的异常、测试的函数,以及传递给函数的参数。(如果被测试函数有不止一个参数,把它们按顺序全部传递给 assertRa ises ,它会把这些参数传给被测的函数。)


10、能够自如地做到如下 Python 的特有工作:
• 继承 unittest.TestCase 生成子类并为每个单独的测试用例编写方法。
• 使用 assertEqual 检查已知结果的返回。
• 使用 assertRa ises 检查函数是否引发已知异常。
• 在 if __name__ 子句中调用 unittest.main() 来一次性运行所有测试用例。
• 以详细     (verbose)     或者普通     (regular)     模式运行单元测试


11、os.path.dirname 接受作为字符串传来的文件名并返回路径部分。如果给定的文件名不包含任何路径信息,os.path.dirname 返回空字符串。os.path.abspath接受的路径名可以是部分的甚至是完全空白,但总能返回完整有效的路径名。

os.getcwd() 返回当前的工作路径。用空字符串调用 os.path.absp ath 将返回当前的工作路径,与 os.getcwd()的效果相同。以不完整的路径名调用 os.path.absp ath 可以构建一个基于当前工作路径且完整有效的路径名。 以完整的路径名调用 os.path.absp ath 则简单地将其直接返回。传递给 os.path.abspath  的路径名和文件名可以不存在。


12、Python 有一个内建 filter 函数,它接受两个参数:一个函数和一个列表,返回一个列表。作为第一个参数传递给 filter 的函数本身应接受一个参数,filter返回的列表将会包含被传入列表参数传递给 filter 所有可以令函数返回真 (true)的元素。


13、内建 map 函数接受一个函数和一个列表作为参数,并对列表中的每个元素依次调用函数返回一个新的列表。


14、动态导入模块:内建 __import__ 函数与 import 语句的既定目标相同,但它是一个真正的函数,并接受一个字符串参数。

 sys = __import__('sys')                #变量 sys 现在是 sys 模块,和 import sys  的结果完全相同


15、loadT estsFromModule 方法:内省每一个模块并为每个模块返回一个 unittest.TestSuite 对象。每个 TestSuite (测试套件) 对象都包含一个 TestCase 对象的列表,每个对象对应着模块中的一个测试方法。


16、re.sub 函数进行以正则表达式为基础的替换工作。re.sub 替换所有 的匹配项,并不只是第一个匹配项。

re.sub(' [abc]', 'o', 'Mark')                     #对Mark进行替换,所以匹配'[abc]'条件的字符都替换成'o'


17、生成器

>>> def make _counter(x):
...    print 'enteringmake_counter'
...    while 1:
...      yield x             (1)
...      print 'incrementing x'
...      x =x + 1
... 
>>> counter =make_counter(2) (2)
>>> counter                (3)

<generator object at 0x001C9C 10>
>>> counter.next()          (4)
entering make_counter
2
>>> counter.next()          (5)
incrementing x
3

(1)  make_counter 中出现关键字 yield 意味着这不是一个普通的函数。它是一种每次生成一个值的特殊函数。你可以把它看成是一个可恢复函数。调用它会返回一个生成器,它可以返回 x 的连续值。
(2)  想要创建一个 make_counter 生成器的实例,只要像其它函数一样调用。注意这并没有真正执行函数代码。你可以分辨出这一点,因为 make_counter的第一行是 print 语句,然而没有任何内容输出。(3)  make_counter 函数返回一个生成器对象。
(4)  你第一次调用生成器对象的 next() 方法,将执行 make_counter 中的代码执行到第一个 yield 语句,然后返回生产 (yield) 出来的值。在本例中,这个值是2,因为你是通过 make_counter(2) 来创建最初的生成器的。
(5)  不断调用生成器对象的 next() 将从你上次离开的位置重新开始 并继续下去直到你又一次遇到 yield 语句。接下来执行 print 语句来打印 incrementing x,然后执行 x =x +  1 语句来真正地增加。然后你进入 while 的又一次循环,你所做的第一件事是 yield x,返回目前的 x 值 (现在是 3)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值