Python має приголомшливий набір інструментів для форматування рядків, але документація до них є надто теоретичною і технічною. В цій статті я намагатимусь показати найбільш поширені приклади використання форматування рядків, через порівняння старого і нового стилів в практичних прикладах.
Всі приклади працюють з Python 2.7, 3.2, 3.3, та 3.4, якщо не вказано інше, без будь-яких інших додаткових бібліотек.
Основи:
Просте форматування по індексу, є, напевне, найбільш поширеним. Використовуйте його в тому випадку, якщо не збираєтесь змінювати порядок аргументів або якщо ви маєте лише кілька елементів для контенканації.
Оскільки елементи не представлені ніякою змінною, то цей простий стиль форматування можна використовувати лише для невеликої кількості елементів.
Old: '%s %s' % ('one', 'two')
New: '{} {}'.format('one', 'two')
>>> 'one two'
Old: '%d %d' % (1, 2)
New: '{} {}'.format(1, 2)
>>> '1 2'
В новому стилі форматування можливо надати позиційний індекс для аргументів. Це дозволяє змінювати порядок відображення елементів, не змінюючи їх.
Old: not available
New: '{1} {0}'.format('one', 'two')
>>> 'two one'
Відступи і вирівнювання рядків
За замовчуванням, елементи займають мінімальну кількість символів. Проте, також можливо зробити, щоб рядки доповнювались необхідною кількістю порожніх символів.
Вирівнювання по правому боці:
Old: '%10s' % ('test',)
New: '{:>10}'.format('test')
>>> ' test'
Вирівнювання по лівому боці:
Old: '%-10s' % ('test',)
New: '{:10}'.format('test')
>>> 'test '
Через аргумент:
У попередньому прикладі, значення 10 передається, як частина формату рядка. Однак його можна передати і як аргумент:
Old: '%*s' % ((- 8), 'test')
New: '{:<{}s}'.format('test', 8)
>>> 'test '
Знову ж таки, новий стиль форматування перевершує старий, шляхом надання більшого контролю над заповненням і вирівнюванням значень.
Ви можете вибрати символ, яким будуть заповнюватись пропуски:
Old: not available
New: '{:_<10}'.format('test')
>>> 'test______'
Також, вирівнювання по центру:
Old: not available
New: '{:^10}'.format('test')
>>> ' test '
Скорочення довгих рядків
Також, ви можете вкоротити занадто довгий рядок.
Цифра після .
вказує точність виводу. Для рядків це означає кількість символів, що виводяться. В нашому прикладі, це буде 5:
Old: '%.5s' % ('xylophone',)
New: '{:.5}'.format('xylophone')
>>> 'xylop'
Через аргумент:
Old: '%.*s' % (7, 'xylophone')
New: '{:.{}}'.format('xylophone', 7)
>>> 'xylopho'
Поєднання скорочення і відступів
Також, можливо поєднувати скорочення і відступи в рядках:
Old: '%-10.5s' % ('xylophone',)
New: '{:10.5}'.format('xylophone')
>>> 'xylop '
Цифри
Звісно ж, цифри також можна форматувати.
Цілі:
Old: '%d' % (42,)
New: '{:d}'.format(42)
>>> '42'
Числа з плаваючою точкою:
Old: '%f' % (3.141592653589793,)
New: '{:f}'.format(3.141592653589793)
>>> '3.141593'
Відступи в числах
Подібно, як і в рядках, для чисел можна резервувати певну кількість пустих символів.
Old: '%4d' % (42,)
New: '{:4d}'.format(42)
>>> ' 42'
Знову ж таки, подібно до скорочення рядків, в числах з плаваючою точкою можна обмежувати кількість символів після коми.
В прикладі нижче ми виводимо 6 елементів десяткового числа і з них 2 - після коми:
Old: '%06.2f' % (3.141592653589793,)
New: '{:06.2f}'.format(3.141592653589793)
>>> '003.14'
Цифри із знаками
За замовчуванням, лише від'ємні числа мають знак(-). Звісно ж, це можна змінити:
Old: '%+d' % (42,)
New: '{:+d}'.format(42)
>>> '+42'
Використовуйте знак пробілу, щоб вказати, що від'ємні числа мають бути з мінусом, а перед додатніми стояти пробіл:
Old: '% d' % ((- 23),)
New: '{: d}'.format((- 23))
>>> '-23'
Old: '% d' % (42,)
New: '{: d}'.format(42)
>>> ' 42'
Новий стиль форматування також дозволяє контролювати позицію символа (+ -):
Old: not available
New: '{:=5d}'.format((- 23))
>>> '- 23'
Іменовані слоти
Обидва стилі форматування підтримують іменовані заповнювачі.
data = {'first': 'Hodor', 'last': 'Hodor!'}
Old: '%(first)s %(last)s' % data
New: '{first} {last}'.format(**data)
>>> 'Hodor Hodor!'
.format()
також дозволяє використовувати ключові аргументи:
Old: not available
New: '{first} {last}'.format(first='Hodor', last='Hodor!')
>>> 'Hodor Hodor!'
Getitem and Getattr
Новий стиль форматування надає ще більшу гнучкість в доступі до вкладених структур даних.
Доступ до контейнерів, що підтримують __getitem__
напр. списки, словники:
person = {'first': 'Jean-Luc', 'last': 'Picard'}
Old: not available
New: '{p[first]} {p[last]}'.format(p=person)
>>> 'Jean-Luc Picard'
data = [4, 8, 15, 16, 23, 42]
Old: not available
New: '{d[4]} {d[5]}'.format(d=data)
>>> '23 42'
Доступ до атрибутів через getattr()
:
class Plant(object):
type = 'tree'
Old: not available
New: '{p.type}'.format(p=Plant())
>>> 'tree'
Обидва види доступу можуть біти змішаними:
class Plant(object):
type = 'tree'
kinds = [{'name': 'oak'}, {'name': 'maple'}]
Old: not available
New: '{p.type}: {p.kinds[0][name]}'.format(p=Plant())
>>> 'tree: oak'
Datetime
Крім цього новий стиль форматування дозволяє об'єктам управляти власним рендерингом. Це, наприклад, дозволяє форматувати як рядки об'єкти DateTime:
from datetime import datetime
New: '{:%Y-%m-%d %H:%M}'.format(datetime(2001, 2, 3, 4, 5))
>>> '2001-02-03 04:05'
Користувальницькі об'єкти
Приклад вище працює за рахунок використання методу __format__()
. Ви можете визначити обробку форматів у власних об'єктах, через перевизначення цього методу. Це надає вам повний контроль над синтаксисом, що використовується.
class HAL9000(object):
def __format__(self, format):
if (format == 'open-the-pod-bay-doors'):
return "I'm afraid I can't do that."
return 'HAL 9000'
New: '{:open-the-pod-bay-doors}'.format(HAL9000())
>>> I'm afraid I can't do that.
Що ж, це напевно і все. Пишіть в коментарях який стиль форматування ви використовуєте і чому.
Ще немає коментарів