首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为了获得完整的python文件接口,我需要实现的文件方法的最小子集是多少?

为了获得完整的python文件接口,我需要实现的文件方法的最小子集是多少?
EN

Stack Overflow用户
提问于 2011-03-17 12:56:35
回答 3查看 1.1K关注 0票数 9

Python有一个很棒的collections模块,它的工具允许您从最少的方法集实现完整的dict (例如)。Python中的file接口也有类似的东西吗?如果不是这样,您会推荐什么方法作为实现file-like对象的最小方法集,以实现鸭子类型目的?

您如何处理那些希望在with语句中使用您的文件(如object )的对象(就像处理常规文件一样),或者希望遍历它(就像处理常规文件一样),或者希望能够调用readlinereadlines并让它做一些智能和有用的事情(就像您可以处理常规文件一样)?你必须自己去实现它们吗?还是有更好的选择?

我知道我可以自己手动实现其中的每一个。但是collections接口允许我通过只实现__len____iter____setitem____getitem__来实现一个__len__。我免费获得了poppopitemclearupdatesetdefault__contains__keysitemsvalues、<代码>D22、<代码>D23和<代码>D24。为__dict__定义了一个最小接口,如果我实现它,我会得到完整的dict接口,所有额外的方法都是用最小接口实现的。

同样,我想知道为了获得完整的接口,我必须实现的文件的最小接口是什么。如果我只实现__enter____exit__readlinereadlines__iter__next,有没有办法得到readwriteclose,或者每次我想要完整的<代码>D36接口时,我必须自己手动实现所有的东西吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-17 18:17:04

with语句需要上下文管理器:

http://docs.python.org/library/stdtypes.html#typecontextmanager

文件类型是完全定义的:

http://docs.python.org/library/stdtypes.html#file-objects

看起来很简单。

文档列出了文件和上下文管理器的方法和属性。实现这些。

你需要更多的信息吗?

http://docs.python.org/library/contextlib.html?highlight=context%20manager

如果你想让所有的方法都能工作,你必须实现所有的方法。与集合不同的是,文件没有抽象基类。

票数 3
EN

Stack Overflow用户

发布于 2011-03-17 13:03:17

我会考虑io.IOBase1和io.RawIOBase的兼容性。这将使您继续使用3.x (io实现了3.x文件接口)。

1

票数 2
EN

Stack Overflow用户

发布于 2011-03-17 13:04:19

你自己回答的。虽然没有实现文件接口所需的一组“特殊”方法,但只需提供几个通常与文件相关的方法即可。鸭子类型会处理剩下的事情。

您实际上只需要一个read和/或write方法(取决于您是否希望它是可读和/或可写的),它们的行为与普通文件对象相同。您可以查看Python file object参考,以了解文件对象的所有方法。基本上,你实现的越多,你的类代替文件工作的情况就越多。(例如,如果您实现了seek,那么它将在对文件执行查找的任何函数中工作。)请注意,这里有一个连续体,没有绝对的“它支持或不支持文件协议”。事实上,不可能在所有支持类文件对象的地方100%工作,因为一些代码将访问真实file类型的低级细节,而您的代码不能在那里工作。

总而言之,任何实现readwrite的类都可以在大多数需要“类文件对象”的情况下工作。

(注意,除了像[key]这样的特殊语法使用特殊的方法名之外,dict的特殊方法名实际上并不特殊,这就是为什么dict有特殊的方法名,而__getitem__没有的原因。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5335017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档