【问题标题】:Which methods implement the buffer interface in Python?Python中哪些方法实现了缓冲区接口?
【发布时间】:2010-01-16 23:08:40
【问题描述】:

我有一个带有 serialize 方法的自定义类,我希望能够将这个类直接写入文件,并在 Python 2.6 中编写 serialize 方法的返回值。 (我不是想pickle 我的对象,这是完全不同的东西。)例如:

class Foo(object):
    def serialize(self):
        return "Hello World!"
    __str__ = serialize

foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)

但是,当我运行此代码时,出现以下异常

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo

好的,所以我需要我的Foo 类来实现buffer 接口。我什至在the buffer documentation 中看到它说:“缓冲区接口的示例用户是文件对象的 write() 方法。任何可以通过缓冲区接口导出一系列字节的对象都可以写入文件。”

显然我可以做我想做的事,但文档实际上并没有说明我需要实现哪些方法才能实现缓冲区接口。我尝试过实现__str____unicode____len__,甚至__sizeof__。我已经实现了__getitem____setitem____delitem__,同时接受intslice 参数。为了安全起见,我什至尝试实现已弃用的__getslice____setslice____delslice__ 方法。无论我尝试什么,我仍然得到完全相同的异常。

作为参考,这里是buffer内置类的方法:

>>> dir(buffer)
['__add__', '__class__', '__cmp__', '__delattr__', '__delitem__', '__delslice__',
 '__doc__', '__format__', '__getattribute__', '__getitem__', '__getslice__', 
'__hash__', '__init__', '__len__', '__mul__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__',  '__rmul__', '__setattr__', '__setitem__', 
'__setslice__', '__sizeof__', '__str__', '__subclasshook__']

我想避免一一实现所有这些,我特别想找到关于哪些方法是必要的文档。

这是只能在 C 扩展类中实现的东西吗?还是我遗漏了一些明显的东西?

【问题讨论】:

    标签: python buffer


    【解决方案1】:

    特别的是,纯 Python 编码的类无法直接实现支持buffer 接口的特殊方法——本来应该是PEP 298,但它被撤回了。

    恐怕你将不得不使用一些显式的属性或方法(或像str 这样的内置函数,它在内部调用一个特殊的方法)将你的类的实例传递给file.write &c:-(.

    【讨论】:

    • 唉,感谢您确认这一点,我自己找不到任何明确表示您无法在 Python 中实现缓冲区接口的内容。
    【解决方案2】:

    文档说,

    用 C 实现的 Python 对象可以 导出一组称为 “缓冲接口。”

    你的 Foo 类没有用 C 实现,是吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多