Да обърнем внимание на форматирането на стринг

Публикувано на

Днес ми се случи един странен проблем, на който искам да обърна внимание свързан с форматиране на стрингове в Python. Всички знаем форматирането във версиите преди 2.7

>>> print "Some text %s" % 'other text'
Some text other text

>>> print "Some text %s %s" % ('other', 'text')
Some text other text

Това можем да го ползваме най-вече за подаване на съобщение от променлива

>>> message = u'This is the message'
>>> print 'The message is: %s' % message
The message is: This is the message

До тук всичко е ясно и не казвам нищо ново. Ето един пример и за '%r' една не толкова често срещана форма на форматиране

>>> value = u'This is the message'
>>> print 'The message is: %r' % message
The message is: u'This is the message'

Както се вижда при този пример не се извиква str(message) а repr(message), което може да е удобно в ситуации когато искаме да изпишем някакъв текст който да ни служи за дебъг. По този начин виждаме точно какъв е типът на променливата.

И тук идва моят проблем. Какво мислите ще се случи ако променливата е от тип  tuple?

>>> value = ('first item', 'second item')
>>> print 'My value is: %r' % value
TypeError: not all arguments converted during string formatting

Това се получава, защото tuple се използва когато искаме да форматираме стринг с няколко променливи. За да може вашият код да е Exception safe трябва да се направи да изглежда така:

>>> value = ('first item', 'second item')
>>> print 'My value is: %r' % (value,)
My value is: ('first item', 'second item')

За това когато не знаем какъв точно тип обект ще дадем за аргумент на стринг с един параметър е хубаво да го направим като tuple с един елемент и нашият аргумент да е вътре.

blog comments powered by Disqus