2016-02-04 1 views
2

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)

+0

Peut-être à un moment donné à l'avenir la méthode paren fonctionnera: https://github.com/zzzeek/mako/pull/19 –

Répondre

1

Assez proche, vous pouvez essayer d'évaluer simplement le bit ou dans la boucle for. Cela a fonctionné pour moi

<% 
    class foo(object): 
     def __init__(self, name, id): 
      self.name = name 
      self.id = id 
    foo_list = [foo('name1', 123), foo('name2', 23423), foo('name3', 3450)] 
%> 
% for my_foo in foo_list: 
    <% foo_id = my_foo.id | 0x8000 %> 
#define ${my_foo.name}_THING ${foo_id} 
% endfor 

et la sortie était

#define name1_THING 32891 

#define name2_THING 56191 

#define name3_THING 36218