На этом шаге мы рассмотрим небольшой пример, позволяющий унифицировать исходный код.
Вот вам полезный совет, когда вы добавляете и удаляете элементы из константы списка, словаря или множества в Python: завершайте все строки запятой.
Не очень понятно? Тогда вот вам примерчик. Предположим, что в вашем исходном коде есть вот такой список имен:
>>> names = ['Элис', 'Боб', 'Дилберт']
Всякий раз, когда вы вносите изменения в этот список, будет трудно сказать, что именно было изменено, к примеру, в ситуации, когда вы будете смотреть на результат команды Git diff. Большинство систем управления исходным кодом строчно-ориентированы и с трудом справляются с выделением многочисленных изменений, вносимых в одной-единственной строке.
Быстрым решением будет принятие стиля оформления кода, при котором вы разворачиваете константы списка, словаря или множества на нескольких строках, как показано ниже:
>>> names = [ 'Элис', 'Боб', 'Дилберт' ]
Благодаря этому получится один элемент на строку, и во время просмотра результатов команды diff в своей системе управления исходным кодом станет предельно ясно, какой из них был добавлен, удален или изменен. Это небольшое изменение помогает избежать глупых ошибок. Оно также расширило возможности коллег просматривать изменения в исходном коде.
Нужно сказать, что два случая редактирования по-прежнему могут вызывать некоторое недоразумение. Всякий раз, когда вы добавляете новый элемент в конец списка или удаляете последний элемент, вам придется вручную обновлять размещение запятой для получения единообразного форматирования.
Допустим, что в этот список вы хотите добавить еще одно имя (Джейн). Если вы добавите Джейн, то, чтобы избежать дурацкой ошибки, вам нужно исправить размещение запятой после строки Дилберт:
>>> names = [ 'Элис', 'Боб', 'Дилберт' # <- Пропущенная запятая! Джейн' ]
После того как вы проинспектируете содержимое этого списка, будьте готовы удивиться:
>>> names
['Элис', 'Боб', 'ДилбертДжейн']
Как видите, Python объединил строковые литералы Дилберт и Джейн в ДилбертДжейн. Такое поведение, которое называется "конкатенацией строковых литералов", является преднамеренным и задокументированным. И оно также предоставляет фантастическую возможность выстрелить себе в ногу, внося в ваши программы трудноотлавливаемые ошибки:
Применение многочисленных смежных строковых или байтовых литералов (разделенных пробелом), в некоторых случаях с использованием разных согласованных правилами оформления кавычек, допустимо, и их значение идентично их конкатенации.
Вместе с тем в некоторых случаях конкатенация строковых литералов является полезным функциональным средством языка. Например, ее можно использовать для сокращения количества обратных слешей (дробных черт), необходимых для разбиения длинных строковых констант на несколько строк кода:
my_str = ('Это супердлинная строковая константа, ' 'развернутая на несколько строк. ' 'И обратите внимание - не требуется никаких обратных дробных черт!')
С другой стороны, мы только что увидели, как это же самое функциональное средство языка может быстро превратиться в помеху. Итак, каким же образом эту ситуацию можно исправить?
Добавление пропущенной запятой после Дилберт не дает объединить два строковых литерала в один:
>>> names = [ 'Элис', 'Боб', 'Дилберт', Джейн' ]
Но теперь мы совершили полный круг и вернулись к изначальной проблеме. Пришлось изменить две строки кода, чтобы добавить в список новое имя. Это снова затрудняет просмотр командой Git diff того, что было изменено... Добавил ли кто-то новое имя? Изменил ли кто-то имя Дилберта?
К счастью, синтаксис языка Python допускает небольшую свободу маневра, тем самым позволяя решить проблему размещения запятой раз и навсегда. Прежде всего, вам просто нужно привыкнуть применять стиль оформления кода, который ее избегает. Давайте рассмотрим, как это делается.
В Python запятая может размещаться после каждого элемента в константе списка, словаря или множества, включая последний элемент. В силу этого вам просто нужно не забывать всегда заканчивать строки запятой, и таким образом вы избежите жонглирования с размещением запятых, которое требовалось бы в противном случае.
Вот как будет выглядеть окончательный пример:
>>> names = [ 'Элис', 'Боб', 'Дилберт', ]
Вы заметили запятую после строкового литерала Дилберт? Этот трюк сделает добавление или удаление новых элементов проще и избавит от необходимости обновлять размещение запятой. Он унифицирует ваши строки, очистит результаты команды diff в системе управления исходным кодом, а рецензенты вашего кода станут счастливее. Иногда волшебство кроется в мелочах, не правда ли?
На следующем шаге мы подитожим приведенный на этом шаге материал.