Nous convertissons un tas de composants de génération de code roulés à la main en utilisant des modèles mako, et une partie du code que nous convertissons utilise l'opérateur bit à bit ou (|
) pour calculer certains de ses valeurs.Utilisation de l'expression au niveau du bit ou dans mako
Par exemple, l'original était quelque chose comme:
for my_foo in foo_constants():
output += "#define %s_THING %d\n" % (my_foo.name, my_foo.id | 0x8000)
Maintenant en mako, notre première tentative a été:
% for my_foo in foo_constants():
#define ${my_foo.name}_THING ${my_foo.id | 0x10000}
% endfor
Mais jeté l'erreur TypeError: 'int' object is not callable
, parce que Mako compilé cette ligne à:
__M_writer(65536(unicode(my_foo.id)))
Depuis mako utilise le |
r signifier "diriger la gauche vers la fonction sur la droite". Entourant l'expression avec une couche supplémentaire de parenthèses, comme ${(my_foo.id | 0x10000)}
, n'a pas aidé. Il a produit
mako.exceptions.SyntaxException: (SyntaxError) invalid syntax (<unknown>, line 1) (u'0x10000),') in file '/tmp/test_template.mako' at line: 2 char: 29
Pour l'instant, nous allons simplement ajouter une fonction bit_or
au contexte de notre modèle et appeler, mais comme la documentation Mako ne semble pas parler de cette question à tout ce que je me demandais si il y a une solution évidente qui nous manque.
Mise à jour: de la version 1.0.4 Mako, la solution est une couche de parenthèses supplémentaire:
% for my_foo in foo_constants():
#define ${my_foo.name}_THING ${(my_foo.id | 0x10000)}
% endfor
(Cela ne marchera pas dans la version 1.0.3, qui a été la version actuelle lorsque cette question a été postée)
Peut-être à un moment donné à l'avenir la méthode paren fonctionnera: https://github.com/zzzeek/mako/pull/19 –