#28721: Cannot use the variable name "inf" in templates
-------------------------------------------+------------------------
Reporter: Fraser Nevett | Owner: nobody
Type: Bug | Status: new
Component: Template system | Version: 1.11
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------------+------------------------
Trying to render a template variable named **inf** does not work:
{{{#!python
>>> from django.template import Template, Context
>>> Template('{{ inf }}').render(Context({'inf': 'xxx'}))
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/tmp/venv/lib/python2.7/site-packages/django/template/base.py",
line 191, in __init__
self.nodelist = self.compile_nodelist()
File "/tmp/venv/lib/python2.7/site-packages/django/template/base.py",
line 233, in compile_nodelist
e.template_debug = self.get_exception_info(e, e.token)
AttributeError: 'exceptions.OverflowError' object has no attribute 'token'
}}}
It also fails if the variable is undefined in the context:
{{{#!python
>>> Template('{{ inf }}').render(Context())
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/tmp/venv/lib/python2.7/site-packages/django/template/base.py",
line 191, in __init__
self.nodelist = self.compile_nodelist()
File "/tmp/venv/lib/python2.7/site-packages/django/template/base.py",
line 233, in compile_nodelist
e.template_debug = self.get_exception_info(e, e.token)
AttributeError: 'exceptions.OverflowError' object has no attribute 'token'
}}}
This is happening because `'inf'` is used in Python to represent infinity:
{{{#!python
>>> float('inf')
inf
}}}
The problem appears to be with
[https://github.com/django/django/blob/1.11.6/django/template/base.py#L809-L819
this bit of the code]:
{{{#!python
# First try to treat this variable as a number.
#
# Note that this could cause an OverflowError here that we're
not
# catching. Since this should only happen at compile time,
that's
# probably OK.
self.literal = float(var)
# So it's a float... is it an int? If the original value
contained a
# dot or an "e" then it was a float, not an int.
if '.' not in var and 'e' not in var.lower():
self.literal = int(self.literal)
}}}
It successfully converts the string `'inf'` to a float with value of
infinity, but then trying to convert this float to an int causes the
OverflowError:
{{{#!python
>>> int(float('inf'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: cannot convert float infinity to integer
}}}
Python also supports floats of `'-inf'` and `'nan'`. Using `'-inf'` as a
template variable name doesn't work because it isn't a valid variable
name. Using `'nan'` as a template variable name works OK:
{{{#!python
>>> Template('{{ nan }}').render(Context({'nan': 'xxx'}))
u'xxx'
}}}
I think the fix is to allow variables named **inf**, rather than to
support using **inf** as a float literal within templates.
--
Ticket URL: <https://code.djangoproject.com/ticket/28721>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/050.2e14334d8ff7aa678a3ed964646ed5dc%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.