Search code examples
pythonstring-formattingpython-2.6backport

String formatting without index in python2.6


I've got many thousands of lines of python code that has python2.7+ style string formatting (e.g. without indices in the {}s)

"{} {}".format('foo', 'bar')

I need to run this code under python2.6 which requires the indices.

I'm wondering if anyone knows of a painless way allow python2.6 to run this code. It'd be great if there was a from __future__ import blah solution to the problem. I don't see one. Something along those lines would be my first choice.

A distant second would be some script that can automate the process of adding the indices, at least in the obvious cases:

"{0} {1}".format('foo', 'bar')

Solution

  • It doesn't quite preserve the whitespacing and could probably be made a bit smarter, but it will at least identify Python strings (apostrophes/quotes/multi line) correctly without resorting to a regex or external parser:

    import tokenize
    from itertools import count
    import re
    
    with open('your_file') as fin:
        output = []
        tokens = tokenize.generate_tokens(fin.readline)
        for num, val in (token[:2] for token in tokens):
            if num == tokenize.STRING:
                val = re.sub('{}', lambda L, c=count(): '{{{0}}}'.format(next(c)), val)
            output.append((num, val))
    
    print tokenize.untokenize(output) # write to file instead...
    

    Example input:

    s = "{} {}".format('foo', 'bar')
    if something:
        do_something('{} {} {}'.format(1, 2, 3))
    

    Example output (note slightly iffy whitespacing):

    s ="{0} {1}".format ('foo','bar')
    if something :
        do_something ('{0} {1} {2}'.format (1 ,2 ,3 ))