Python string template vs. concatenação pegadinha

Esteja ciente de como o Python trata Nenhum de maneira diferente ao concatenar strings e ao usar modelos de string. A tentativa de catar um None para uma string (ou vice-versa) levantará um TypeError, enquanto o Python permite que você passe None para um modelo de formatação de string … e é renderizado como ‘Nenhum’.

Conforme observado nos comentários de @jswinarton , isso acontece porque, embora a concatenação não faça nenhuma coerção de tipo, o operador% s garante strings chamando str no valor (e a representação de string de None é ‘None’).

>>> 'ickleme' + 'pickleme'
'icklemepickleme'
>>> '%s%s' % ('ickleme', 'pickleme')
'icklemepickleme'
>>> 'pickleme' + None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'NoneType' objects
>>> '%s%s' % ('pickleme', None)
'picklemeNone'
>>>

Observe o mesmo comportamento para strings de formatação nomeadas:

>>> '%(captain)s, %(crew)s, %(boatswain)s' % { 'captain':'ickleme', 'crew':'pickleme', 'boatswain':None }
'ickleme, pickleme, None'