Python Cookbook-2.15 用类文件对象适配真实文件对象

任务

需要传递一个类似文件的对象(比如,调用urllib.urlopen 返回的结果)给一个函数或者方法,但这个函数或方法要求只接受真实的文件对象(比如,像marshalload 这样的函数)。

解决方案

为了过类型检查这一关,我们需要将类文件对象中的所有数据写入到磁盘中的一个临时文件。然后使用临时文件的(真实)文件对象。下面给出一个实现这个想法的函数:

python 复制代码
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_SIE)
		if not data: break
		tmpFileObi.write(data)
	fileObj.close()
	tmpFileObj.seek(0)
	return tmpFileObj

讨论

本节展示的其实是设计模式中的适配器(即Adapter,比如你想要X,我却给你Y以替换 X)的 Python 风格的实现。虽然设计模式通常被认为是一种面向对象的设计方式,因此一般需要用类来实现,但具体实现并没有什么限制。比如此例中,我们根本不需要引人任何新类,因为 adapt file 函数已经足够了。这里我们遵守奥卡姆剃刀原理(译者注:Occam'sRazor,奥卡姆是14世纪的一个逻辑学家和天主教修道士,奥卡姆剃刀原理即"如无必要,勿增实体"),不在没有必要的情况下引入任何实体。

当需要依赖一些底层的、要求精确类型的工具时,应该首先考虑适配,而不是类型检查。当获得一个适合的可以绕过类型检查的对象时,应该考虑将其配接成需要的对象。用这种方式,你的代码会更加灵活,也更具复用性。

相关推荐
范纹杉想快点毕业10 分钟前
深入解析C++静态成员变量与函数
java·开发语言·jvm
奋斗者1号17 分钟前
解决 uv run 时 ModuleNotFoundError: No module named ‘anthropic‘ 的完整指南
python
小森776718 分钟前
(八)深度学习---计算机视觉基础
人工智能·python·深度学习·算法·计算机视觉
蹦蹦跳跳真可爱5891 小时前
Python----循环神经网络(WordEmbedding词嵌入)
人工智能·python·rnn·自然语言处理
JosieBook1 小时前
【web应用】配置Java JDK与maven3的环境变量
java·开发语言
熊猫在哪1 小时前
野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit Lite2
人工智能·python·嵌入式硬件·深度学习·神经网络·目标检测·机器学习
普通的冒险者1 小时前
用java实现内网通讯,可多开客户端链接同一个服务器
java·开发语言
Muroidea1 小时前
解决RedisTemplate的json反序列泛型丢失问题
java·开发语言·json
大飞记Python2 小时前
自动化测试脚本点击运行后,打开Chrome很久??
开发语言·python
程序员麻辣烫2 小时前
go语法大赏
开发语言·数据库·golang