Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Форматирование строк. Составные имена полей




Форматирование строк

Строки можно создавать как с помощью одинарных, так и с помощью двойных кавычек.

Давайте взглянем еще раз на humansize. py:

SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], ①
1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}

def approximate_size(size, a_kilobyte_is_1024_bytes=True):
'''Convert a file size to human-readable form. ②

Keyword arguments:
size -- file size in bytes
a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
if False, use multiples of 1000

Returns: string

''' ③
if size < 0:
raise ValueError('number must be non-negative') ④

multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
for suffix in SUFFIXES[multiple]:
size /= multiple
if size < multiple:
return '{0:. 1f} {1}'. format(size, suffix) ⑤

raise ValueError('number too large')

  • ① 'KB', 'MB', 'GB'… - это все строки.
  • ② Комментарии к функции - это тоже строка. Комментарии к функции могут быть многострочными, поэтому используются тройные кавычки вначале и в конце строки.
  • ③ Эти тройные кавычки заканчивают комментарии к функции.
  • ④ Здесь еще одна строка, которая передается конструктору исключения как удобочитаемый текст ошибки.
  • ⑤ Здесь … ого, это ещё что такое?

Python 3 поддерживает форматирование значений в строки. Форматирование может включать очень сложные выражение. Самое простое использование - это вставка значения в поле подстановки строки.

> > > username = 'mark'
> > > password = 'PapayaWhip' ①
> > > " {0}'s password is {1}". format(username, password) ②
" mark's password is PapayaWhip"

  • ① Вы же не думаете, что мой пароль действительно PapayaWhip
  • ② Здесь много чего происходит. Во первых, вызывается метод format(…) для строки. Строки - это объекты, а у объектов есть методы. Во вторых, значением всего выражения будет строка. В третьих, {0} и {1} являются полями, которые заменяются аргументами, переданными методу format()

Составные имена полей

Предыдущий пример показал простейший способ форматирования строк: поля в строке представляют из себя целые числа. Эти числа в фигурных скобках означают порядковые номера аргументов в списке параметрах метода format(). Это означает, что {0} заменяется первым аргументом (в данном случаем username), а {1} заменяется на второй аргумент (password), & c. Вы можете иметь столько номеров полей, сколько аргументов есть у метода format(). А аргументов может быть сколько угодно. Но имена полей гораздо более мощный инструмент, чем может показаться на первый взгляд.

> > > import humansize
> > > si_suffixes = humansize. SUFFIXES[1000] ①
> > > si_suffixes
['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
> > > '1000{0[0]} = 1{0[1]}'. format(si_suffixes) ②
'1000KB = 1MB'

  • ① Вместо того, чтобы вызывать какие-либо функции модуля humansize, Вы просто используете один из словарей, которые в этом модуле определены: список суффиксов СИ (степени 1000)
  • ② Этот кусок выглядит сложным, хотя это и не так. {0} ссылается на первый аргумент, переданный методу format() (переменная si_suffixes). Но si_suffixes - это список. Поэтому {0[0]} ссылается на первый элемент этого списка: 'KB'. В тоже время {0[1]} ссылается на второй элемент того же списка: 'MB'. Все, что находится за фигурными скобками - включая 1000, знак равенства, и пробелы - остается нетронутым. В результате мы получим строку '1000KB = 1MB'.

{0} is replaced by the 1st format() argument. {1} is replaced by the 2nd.

Этот пример показывает, что при форматировании в именах полей можно получить доступ к элементам и свойствам структур данных используя (почти) Python синтаксис. Это называется " составные имена полей". Следующие составные имена полей просто работают:

  • Передать список и получить доступ к элементу списка по его индексу (как в предыдущем примере);
  • Передать словарь и получить доступ к значению словаря по его ключу;
  • Передать модуль и получить доступ к его переменным и функциям зная их имена;
  • Передать экземпляр класса и получить доступ к его свойствам и методам по их именам;
  • Любая комбинация выше перечисленных.

И чтобы взорвать ваш мозг, вот пример которые использует все вышеперечисленные возможности:

> > > import humansize
> > > import sys
> > > '1MB = 1000{0. modules[humansize]. SUFFIXES[1000][0]}'. format(sys)
'1MB = 1000KB'

Вот как это работает:

Модуль sys содержит информацию об работающем интерпретаторе Python. Так как Вы его импортировали, то можете использовать в качестве аргумента метода format(). То есть поле {0} ссылается на модуль sys. sys. modules представляет из себя словарь со всеми модулями, которые на данный момент импортированы интерпретатором Python. Ключи этого словаря - это строки с именами модулей; значения - объекты, представляющие импортированные модули. Таким образом поле {0. modules} ссылается на словарь импортированных модулей. sys. modules['humansize'] - это объект, представляющий собой модуль humansize, который Вы только что импортировали. Таким образом составное поле {0. modules[humansize]} ссылается на модуль humansize. Заметьте, что синтаксис здесь отличается. В синтаксисе Python ключи словаря sys. modules являются строками, и чтобы обратиться к значениям словаря необходимо окружить кавычками имя модуля (например 'humansize'). Вот цитата из PEP 3101: Расширенное форматирование строк: " Правила для парсинга ключей очень простые. Если он начинается с цифры, то его нужно интерпретировать как число. Иначе - это строка". sys. modules['humansize']. SUFFIXES - это словарь, определенный в самом начале модуля humansize. Поле {0. modules[humansize]. SUFFIXES} ссылается на этот словарь.

sys. modules['humansize']. SUFFIXES[1000] - это список суффиксов системы СИ: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']. Таким образом поле {0. modules[humansize]. SUFFIXES[1000]} ссылается на этот список. А sys. modules['humansize']. SUFFIXES[1000][0] - это первый элемент списка суффиксов: 'KB'. Таким образом окончательное составное поле {0. modules[humansize]. SUFFIXES[1000][0]} заменяется на строку из двух символов KB.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...