0

オブジェクトクラスに応じて異なるテンプレートを使用するためのクリーンな方法は何ですか?bunchaifステートメント以外

4

1 に答える 1

2

タイプ(つまり、クラス)をキーとして、インスタンスを値として、を作成してdict呼び出すことができます。type2templmako.template.Template

t = type2templ.get(type(theobj), default_templ)
... t.render() ...

これは、それが新しいスタイルのtheobjクラスのインスタンスであることを前提としています(Python 2のデフォルトである、廃止された、最も回避された「レガシー」クラスではありません。これらを使用する場合は、コードを新しいスタイルのクラスに確実にアップグレードする必要があります。 、しかし、ハックの場合は、ここの代わりに使用することは実行可能です)。 は、「上記のいずれでもない」に使用するデフォルトのテンプレートインスタンスです(が認識されないタイプの場合に例外が発生する場合は、呼び出しの代わりに角括弧のインデックスを使用してください)。theobj.__class__type(theobj)default_templtheobj.get

これは(直接)「継承をサポート」しないことに注意してください。たとえば、クラスがテンプレートにfooマップされる場合、サブクラスを作成しますが、インスタンスが使用するテンプレートを明示的に記録しないと、次のようになります。のインスタンスのデフォルトテンプレート。継承のサポートはもっと複雑です-もちろん、makoテンプレートインスタンスをクラス属性の1つにしない限り、それは簡単になります(その属性に名前を付けた場合でも!-)が、ビューをモデルから分離することは理解しています。type2templbarbazfootype2templbaztheobj.thetemplthetempl

于 2010-04-22T02:52:47.770 に答える