ducktape
ducktape copied to clipboard
template renderer renders properties strangely
Refactoring a field into a property can lead to surprising results when rendering
class C(TemplateRenderer):
x = 2
class D(TemplateRenderer):
@property
def x(self):
return 2
c = C()
d = D()
c.render_template("{{x}}") # "2"
d.render_template("{[x}}") # "<property ob... 0x101300e68>"
Cause: @propertys show up in the class dict as a property object, but not in the instance dict, and TemplateRenderer uses these dicts when rendering. So the computed property value isn't visible to the render method.
There's probably a good solution to this somewhere in Jinja itself -- I'd dig around in their code (or example code) to see if there's a better approach for passing a full object as the context but also providing overrides/extensions via extra parameters to the render method.