Mako-Vorlage auf Objektklasse abhängig?
Frage
Was ist eine saubere Art und Weise verschiedene Vorlagen zu verwenden, um auf einer Objektklasse abhängig? andere als buncha if-Anweisungen
Lösung
Sie können eine dict
machen, nennen es type2templ
, mit Typen (das heißt, Klassen) als Schlüssel und mako.template.Template
Instanzen als die Werte - dann
t = type2templ.get(type(theobj), default_templ)
... t.render() ...
Dies setzt voraus, dass theobj
ist eine Instanz eines new-style Klasse (nicht die veralteten, am besten vermieden „Legacy“ Klassen, die nach wie vor der Standard in Python sind 2 - wenn Sie diejenigen verwenden, Sie sollten auf jeden Fall Ihr Code, um neue Stil-Klassen-Upgrade, aber theobj.__class__
verwendet, ist ein praktikables, wenn hackish, Ersatz für type(theobj)
hier). default_templ
ist eine Standardvorlage Instanz Verwendung für „keine der oben genannten“ (wenn Sie eher eine Ausnahme haben würden, wenn theobj
eines nicht erkannte Typs ist, verwendet eckige Klammer Indizierung anstelle des .get
Anrufs).
Beachten Sie, dass dies nicht (direkt) „Unterstützung Erbe“ - wenn (zum Beispiel) Klasse foo
Karten in type2templ
auf Vorlage bar
, dann Sie eine Unterklasse baz
von foo
machen, aber nicht aufzeichnen explizit in type2templ
was template seine Instanzen sollten, verwenden Sie die Standardvorlage für baz
die Instanzen erhalten. Unterstützung von Vererbung ist komplexer - es sei denn, Sie nur den mako Vorlageninstanz einen der Klassenattribute machen, natürlich, die es trivial macht (nur theobj.thetempl
, wenn Sie das Attribut thetempl
nennen -!), Aber ich verstehe die Ansicht trennen von das Modell.