gpt4 book ai didi

python - 检查对象是否在 Python 中类似于文件

转载 作者:IT老高 更新时间:2023-10-28 21:11:29 25 4
gpt4 key购买 nike

File-like objects是 Python 中的对象,其行为类似于真实文件,例如有一个 read() 和一个 write method(),但与 file 有不同的实现。它是 Duck Typing 的实现概念。

在需要文件的任何地方都允许使用类似文件的对象被认为是一种很好的做法,例如一个 StringIO或者可以使用 Socket 对象代替真实文件。所以执行这样的检查是不好的:

if not isinstance(fp, file):
raise something

检查对象(例如方法的参数)是否“类文件”的最佳方法是什么?

最佳答案

对于 3.1+,以下之一:

isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)

对于 2.x,“类文件对象”太模糊了,无法检查,但您正在处理的任何函数的文档都有望告诉您它们实际需要什么;如果没有,请阅读代码。


正如其他答案所指出的,首先要问的是您要检查的内容。通常,EAFP 就足够了,而且更惯用。

The glossary说“类文件对象”是“文件对象”的同义词,这最终意味着它是三个 abstract base classes 之一的实例定义于 the io module ,它们本身都是 IOBase 的子类。所以,检查的方法就是如上所示。

(但是,检查 IOBase 并不是很有用。你能想象一种情况,你需要区分一个实际的文件,如 read(size) 和某个文件-argument function named read that is not file-like, without also need to区分文本文件和原始二进制文件?所以,真的,你几乎总是想检查,例如,“是一个文本文件对象”,而不是“是类文件对象”。)


对于 2.x,虽然 io 模块自 2.6+ 起就存在,内置文件对象不是 io 类的实例,也不是任何文件-stdlib 中的类对象,您可能会遇到的大多数第三方类文件对象也不是。 “类文件对象”的含义没有官方定义;它只是“类似于内置 file object 的东西”,不同的功能用“like”表示不同的东西。此类功能应记录其含义;如果没有,您必须查看代码。

然而,最常见的含义是“具有 read(size)”、“具有 read()”或“是字符串的可迭代对象”,但有些旧库可能期望 readline 而不是其中之一,有些库喜欢 close() 你给他们的文件,有些人会期望如果 fileno存在,则其他功能可用,等等。对于 write(buf) 也是如此(尽管在这个方向上的选项要少得多)。

关于python - 检查对象是否在 Python 中类似于文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1661262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com