#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.

Reply via email to