更多Pythonic转换为二进制?

Jon*_*ric 6 python

这是一个人为的例子,说明我们的很多类如何返回自己的二进制表示(由C++读取).

def to_binary(self):
    'Return the binary representation as a string.'
    data = []

    # Binary version number.
    data.append(struct.pack('<I', [2]))

    # Image size.
    data.append(struct.pack('<II', *self.image.size))

    # Attribute count.
    data.append(struct.pack('<I', len(self.attributes)))

    # Attributes.
    for attribute in self.attributes:

        # Id.
        data.append(struct.pack('<I', attribute.id))

        # Type.
        data.append(struct.pack('<H', attribute.type))

        # Extra Type.        
        if attribute.type == 0:
            data.append(struct.pack('<I', attribute.typeEx))

    return ''.join(data)
Run Code Online (Sandbox Code Playgroud)

我不喜欢的事:

  • 每一行都以data.append(struct.pack(该行的独特部分分散注意力.
  • 字节顺序('<')一遍又一遍地重复.
  • 你必须记得返回样板''.join(data).

我喜欢什么:

  • 格式说明符出现在属性名称附近.例如,很容易看出它self.image.size是作为两个无符号整数写出来的.
  • 这些线(大多数)是独立的.例如,要从"属性"中删除Id字段,您不必触摸多行代码.

是否有更可读/ pythonic的方式来做到这一点?

Dav*_*ave 4

from StringIO import StringIO
import struct

class BinaryIO(StringIO):
    def writepack(self, fmt, *values):
        self.write(struct.pack('<' + fmt, *values))

def to_binary_example():
    data = BinaryIO()
    data.writepack('I', 42)
    data.writepack('II', 1, 2)
    return data.getvalue()
Run Code Online (Sandbox Code Playgroud)