【发布时间】:2011-02-10 20:07:09
【问题描述】:
根据对象类使用不同模板的简洁方法是什么?除了一堆 if 语句
【问题讨论】:
-
在 Python 中工作时,根据对象的类型做不同的事情几乎总是一个设计缺陷。也许您应该预处理您的数据,以便模板可以直接访问它?
-
我会这样做的,我只是意识到我可能做错了什么
根据对象类使用不同模板的简洁方法是什么?除了一堆 if 语句
【问题讨论】:
你可以创建一个dict,叫它type2templ,以类型(即类)作为键,mako.template.Template 实例作为值——然后
t = type2templ.get(type(theobj), default_templ)
... t.render() ...
这假设 theobj 是一个 new-style 类的实例(不是过时的、最好避免的“遗留”类,它们在 Python 2 中仍然是默认的——如果你使用那些,你应该绝对将你的代码升级到新风格的类,但是使用theobj.__class__ 是一个可行的,如果hackish,替代type(theobj) 这里)。 default_templ 是用于“以上都不是”的默认模板实例(如果您希望在 theobj 属于无法识别的类型时出现异常,请使用方括号索引而不是 .get 调用)。
请注意,这不(直接)“支持继承”——如果(例如)type2templ 中的类foo 映射到模板bar,那么您创建foo 的子类baz但不要在type2templ 中明确记录其实例应使用的模板,您将获得baz 实例的默认模板。支持继承更加复杂——除非你只是将 mako 模板实例设为类属性之一,当然,这使得它变得微不足道(如果你将该属性命名为 theobj.thetempl!-),但我确实理解将视图与模型分开。
【讨论】: