Watch out for dict-based string interpolation examples which look like this:

'Hello, %(name)s' % {'name': 'Otter'}

That s after the brackets isn’t pluralising one adorable aquatic mammal into a whole bunch of them, it’s actually part of the interpolation placeholder — the equivalent of

'Hello, %s' % 'Otter'

Note also that for some reason, python lets you put spaces between the closing bracket and the type signifying character. This can cause extremely weird bugs when the string being interpolated is also being translated. For example:

_('%(customer) shared a thing') % {'customer': 'Mr. Bean'}

If not translated, this will produce this confusing but fairly easy to debug output

'Mr. Beanhared a thing'

But if 'shared' is translated into a word beginning with, for example, d, you’ll just get an exception like TypeError: A float is required

updated: