2007-07-18

 

Python Cookbook 2.15 适配(Adapting)类文件对象到文件对象

需求:

你需要传递一个"类文件"(file like)对象(如urllib.nrlopen的返回值)到一个只接收文件对象为参数的方法中(如marshal.load).

讨论:

为了适应类型检查,你需要将类文件对象的内容写入临时文件中,然后再操作这个临时文件,下面的代码实现了这个想法:

import types, tempfile
CHUNK_SIZE = 16 * 1024
def adapt_file(fileObj):
    if isinstance(fileObj, file): return fileObj
    tmpFileObj = tempfile.TemporaryFile
    while True:
        data = fileObj.read(CHUNK_SIZE)
        if not data: break
        tmpFileObj.write (data)
    fileObj.close( )
    tmpFileObj.seek(0)
    return tmpFileObj

本节讲了一个罕见的用Python使用适配器模式的例子(你拥有X但需要用Y来做).设计模式是面向对象中对常考虑的问题,大多通过写类来实现,而本质上并不需要它们.在本节中,我们不需要引入新的类,因为adapt_file方法已经能很好的完成我们的需求,因为,我们尊重奥卡姆剃刀原则(Occam's Razor) ,不引不必要的项目.
在使用适配器的时候,各方面都要考虑到,当请优先检查类型,即使要使用一些低级的工具或者方法.考虑好要用什么适配为什么类型,总比用时报出异常要好.这样,你的代码能更灵活,而且重用性更好.

相关说明:

奥卡姆剃刀(Occam's Razor, Ockham's Razor)
      是由14世纪逻辑学家、圣方济各会修士奥卡姆的威廉(William of Occam)提出的一个原理。奥卡姆(Ockham)在英格兰的萨里郡,那是他出生的地方。
  这个原理称为"如无必要,勿增实体"(Entities should not be multiplied unnecessarily).
      人们常常引用奥卡姆剃刀的一个强形式,叙述如下:

  如果你有两个原理,它们都能解释观测到的事实,那么你应该使用简单的那个,直到发现更多的证据。
  对于现象最简单的解释往往比较复杂的解释更正确。
  如果你有两个类似的解决方案,选择最简单的。
  需要最少假设的解释最有可能是正确的。

  ……或者以这种自我肯定的形式出现:

  让事情保持简单!


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?