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')
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 ))