ここでは、たくさんのクラスが自分自身のバイナリ表現(C++で読まれる)をどのように返すかを考案した例を示します。もっとPythonicのバイナリへの変換?
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)
は私が嫌いなもの:
- すべての行は、行のユニークな部分から邪魔、
data.append(struct.pack(
から始まります。 - バイトオーダー(
'<'
)が何度も繰り返されます。 - ボイラープレート
''.join(data)
を返すことを覚えておく必要があります。- 書式指定子は、属性名の近くに表示されます。私は好き
。たとえば、
self.image.size
が2つの符号なし整数として書き出されることは容易にわかります。 - 行は(ほとんど)独立しています。たとえば、「属性」からIDフィールドを削除するには、複数行のコードを操作する必要はありません。
これを行うには、より読みやすい/ pythonの方法がありますか?
宣言的な構文は、シリアライゼーションを構築するために複雑なプログラムロジックを必要としない場合(つまり、ifとforsがたくさんある場合)に適しています。私は宣言的アプローチを使用して、シリアライズ、デシリアライゼーション、およびバイナリファイル形式のために自動的に生成されたドキュメントを指定しました。 –