Author tbeadle
Recipients tbeadle
Date 2016-06-13.15:32:41
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1465831962.68.0.949862526307.issue27307@psf.upfronthosting.co.za>
In-reply-to
Content
Support for unnumbered fields in string.Formatter.format was added in http://bugs.python.org/issue13598, however, it does not support accessing an index or attribute of an unnumbered field like str.format does.  Instead, it raises an unhelpful "KeyError: ''":

In [1]: import string

In [2]: fmt = string.Formatter()

In [3]: fmt.format('{[0]}', ['a', 'b'])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-3-a923004fe8e8> in <module>()
----> 1 fmt.format('{[0]}', ['a', 'b'])

/usr/lib64/python2.7/string.pyc in format(*args, **kwargs)
    557                 raise TypeError("format() missing 1 required positional "
    558                                 "argument: 'format_string'")
--> 559         return self.vformat(format_string, args, kwargs)
    560 
    561     def vformat(self, format_string, args, kwargs):

/usr/lib64/python2.7/string.pyc in vformat(self, format_string, args, kwargs)
    561     def vformat(self, format_string, args, kwargs):
    562         used_args = set()
--> 563         result = self._vformat(format_string, args, kwargs, used_args, 2)
    564         self.check_unused_args(used_args, args, kwargs)
    565         return result

/usr/lib64/python2.7/string.pyc in _vformat(self, format_string, args, kwargs, used_args, recursion_depth)
    583                 # given the field_name, find the object it references
    584                 #  and the argument it came from
--> 585                 obj, arg_used = self.get_field(field_name, args, kwargs)
    586                 used_args.add(arg_used)
    587 

/usr/lib64/python2.7/string.pyc in get_field(self, field_name, args, kwargs)
    644         first, rest = field_name._formatter_field_name_split()
    645 
--> 646         obj = self.get_value(first, args, kwargs)
    647 
    648         # loop through the rest of the field_name, doing

/usr/lib64/python2.7/string.pyc in get_value(self, key, args, kwargs)
    603             return args[key]
    604         else:
--> 605             return kwargs[key]
    606 
    607 

KeyError: ''


The attached patch adds this functionality.

aronancher asked in http://bugs.python.org/issue13598#msg218114 if the original patch was going to make it in to python 2.7.  Perhaps that could get a look?
History
Date User Action Args
2016-06-13 15:32:42tbeadlesetrecipients: + tbeadle
2016-06-13 15:32:42tbeadlesetmessageid: <1465831962.68.0.949862526307.issue27307@psf.upfronthosting.co.za>
2016-06-13 15:32:42tbeadlelinkissue27307 messages
2016-06-13 15:32:41tbeadlecreate