Використання % і .format() в найкращий спосіб

4 хв. читання

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.

Що ж, це напевно і все. Пишіть в коментарях який стиль форматування ви використовуєте і чому.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.8K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація