Looking for best practice advice on what string substitution technique to use when using gettext(). Or do all techniques apply equally?
I can think of at least 3 string techniques:
1) Classic “%” based formatting:
“My name is %(name)s” % locals()
2) .format() based formatting:
“My name is {name}”.format( locals() )
3) string.Template.safe_substitute()
import string
template = string.Template( “My name is ${name}” )
template.safe_substitute( locals() )
The advantage of the string.Template technique is that a translated string with with an incorrectly spelled variable reference can still yield a usable string value while the other techniques unconditionally raise an exception. The downside of the string.Template technique appears to be the inability for one to customize how a variable is formatted (padding, justification, width, etc).
Actually I would prefer to get an exception during my tests, to fix the error as soon as possible — “errors should not pass silently”. So I consider that approach (2) is the best one in modern Python (which supports the readable and flexible
format), and approach (1) a probably inevitable fall-back if you’re stuck supporting older Python releases (where%was “the” way to do flexible formatting — finding, or coding, some backport offormatwould be the main alternative).