Voici un exemple inventé de la façon dont beaucoup de nos classes renvoient des représentations binaires (à lire en C++) d'elles-mêmes.Plus de conversion Pythonic en binaire?
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)
Ce que je n'aime pas:
- Chaque ligne commence par
data.append(struct.pack(
, distrayant de la partie unique de la ligne. - L'ordre des octets (
'<'
) est répété encore et encore. Vous devez vous rappeler de renvoyer la plaque chauffante''.join(data)
.
Ce que j'aime:
- Les indicateurs de format apparaissent à côté du nom d'attribut. Par exemple, il est facile de voir que
self.image.size
est écrit comme deux ints non signés. - Les lignes sont (pour la plupart) indépendantes. Par exemple, pour supprimer le champ Id d'un 'attribut', vous n'avez pas besoin de toucher plus d'une ligne de code.
Existe-t-il une façon plus lisible/pythonique de faire cela?
La syntaxe déclarative est bonne si vous n'avez pas besoin d'une logique programmatique complexe pour générer la sérialisation (c'est-à-dire beaucoup d'ifs et de fors). J'ai utilisé l'approche déclarative pour spécifier la sérialisation, la désérialisation et la documentation générée automatiquement en une fois pour un format de fichier binaire. –