Python有一个很棒的collections模块,它的工具允许您从最少的方法集实现完整的dict (例如)。Python中的file接口也有类似的东西吗?如果不是这样,您会推荐什么方法作为实现file-like对象的最小方法集,以实现鸭子类型目的?
您如何处理那些希望在with语句中使用您的文件(如object )的对象(就像处理常规文件一样),或者希望遍历它(就像处理常规文件一样),或者希望能够调用readline或readlines并让它做一些智能和有用的事情(就像您可以处理常规文件一样)?你必须自己去实现它们吗?还是有更好的选择?
我知道我可以自己手动实现其中的每一个。但是collections接口允许我通过只实现__len__、__iter__、__setitem__和__getitem__来实现一个__len__。我免费获得了pop、popitem、clear、update、setdefault、__contains__、keys、items、values、<代码>D22、<代码>D23和<代码>D24。为__dict__定义了一个最小接口,如果我实现它,我会得到完整的dict接口,所有额外的方法都是用最小接口实现的。
同样,我想知道为了获得完整的接口,我必须实现的文件的最小接口是什么。如果我只实现__enter__,__exit__,readline,readlines,__iter__和next,有没有办法得到read,write和close,或者每次我想要完整的<代码>D36接口时,我必须自己手动实现所有的东西吗?
发布于 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
如果你想让所有的方法都能工作,你必须实现所有的方法。与集合不同的是,文件没有抽象基类。
发布于 2011-03-17 13:03:17
我会考虑io.IOBase1和io.RawIOBase的兼容性。这将使您继续使用3.x (io实现了3.x文件接口)。
1
发布于 2011-03-17 13:04:19
你自己回答的。虽然没有实现文件接口所需的一组“特殊”方法,但只需提供几个通常与文件相关的方法即可。鸭子类型会处理剩下的事情。
您实际上只需要一个read和/或write方法(取决于您是否希望它是可读和/或可写的),它们的行为与普通文件对象相同。您可以查看Python file object参考,以了解文件对象的所有方法。基本上,你实现的越多,你的类代替文件工作的情况就越多。(例如,如果您实现了seek,那么它将在对文件执行查找的任何函数中工作。)请注意,这里有一个连续体,没有绝对的“它支持或不支持文件协议”。事实上,不可能在所有支持类文件对象的地方100%工作,因为一些代码将访问真实file类型的低级细节,而您的代码不能在那里工作。
总而言之,任何实现read和write的类都可以在大多数需要“类文件对象”的情况下工作。
(注意,除了像[key]这样的特殊语法使用特殊的方法名之外,dict的特殊方法名实际上并不特殊,这就是为什么dict有特殊的方法名,而__getitem__没有的原因。)
https://stackoverflow.com/questions/5335017
复制相似问题