#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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
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