ciao tutti,
i've already opened a ticket [1] that elaborates why i consider the
behaviour of the template engines variable lookup as buggy, i'll copy
the description below.
i also opened a pull request [2] that demonstrates my progress on a
solution so far.
thanks for any feedback.
[1]:
https://code.djangoproject.com/ticket/28782
[2]:
https://github.com/django/django/pull/9341
bug description w/o markup:
there are classes in the Pythoniverse that implement a __getitem__
method for the sake of syntactical sweetness, but they are no mappings.
(in my case it's a wrapper around an xml document where __getitem__
returns the result of xpath evaluations. there are other use-cases
around, but i don't remember any atm.).
this causes a lookup in a template rendering context on an attribute of
such instances to return an unexpected value, because foo[bar] doesn't
necessarily raise an exception and returns some value, while foo.bar was
intended. this is caused by the very implicit implementation of
django.template.base.Variable._resolve_lookup.
my approach to solve this issue is to refactor that method to an
explicit behaviour mainly based on type checks, so a member lookup is
only performed on instances that base on collections.abc.Mapping which
any implementation of a mapping should. my rationale is that the
documentations mentions a dictionary (though mapping would be more
precise term) lookup, not a lookup via __getitem__, and
dictionary/mapping objects should base on the mentioned abstract class
(the why is elaborated in PEP 3119).
beside solving my problem, i would argue that in doubt "explicit is
better than implicit" excels "it's better to ask forgiveness than to ask
permission" and the explicit approach is more comprehensible.