Форматирование строки Python: % vs конкатенация
Я разрабатываю приложение, в котором я выполняю некоторые запросы для получения идентификатора объекта. После каждого из них я вызываю метод (get_actor_info()
) передает этот ID в качестве аргумента (см. код ниже).
ACTOR_CACHE_KEY_PREFIX = 'actor_'
def get_actor_info(actor_id):
cache_key = ACTOR_CACHE_KEY_PREFIX + str(actor_id)
как можно заметить, я кастинг actor_id
to string
и объединение его с префиксом. Однако я знаю, что могу сделать это несколькими другими способами (.format()
или '%s%d'
, например), и это приводит к моему вопросу: would '%s%d'
быть лучше, чем конкатенация строк с точки зрения читаемость, условность кода и эффективность?
спасибо
3 ответов
это может легко стать потоком, основанным на мнении, но я считаю, что форматирование в большинстве случаев более читабельным и более доступным для обслуживания. Легче представить, как будет выглядеть последняя строка, не делая "умственной конкатенации". Какой из них более удобочитаем, например?
errorString = "Exception occurred ({}) while executing '{}': {}".format(
e.__class__.__name__, task.name, str(e)
)
или:
errorString = "Exception occurred (" + e.__class__.__name__
+ ") while executing '" + task.name + "': " + str(e)
Что касается того, следует ли использовать %
или .format()
, Я могу ответить более объективно: используйте .format()
. %
является "старым стилем", и, согласно Python Документация они могут быть скоро удалены:
С
str.format()
довольно новый, много кода Python все еще использует%
оператора. Однако, поскольку этот старый стиль форматирования в конечном итоге будет удален из языка,str.format()
вообще не следует использовать.
более поздние версии документации перестали упоминать об этом, но, тем не менее,.format()
это путь будущего; используйте его!
конкатенация быстрее, но это не стоит беспокоиться. Сделайте свой код читаемым и поддерживаемым как цель первой строки, а затем оптимизируйте части, которые вам нужно оптимизировать позже. Преждевременная оптимизация-корень всех зол;)
сцепление лучше, когда дело доходит до производительности. В вашем примере как конкатенация, так и подстановка удобочитаемы, но когда дело доходит до более сложных шаблонов, подстановка выигрывает гонку простоты и читаемости.
например, если у вас есть данные, и вы хотите показать их в html, конкатенация вызовет у вас головную боль, а подстановка будет простой и читаемой.
Python 3.6 представит еще один вариант:
ACTOR_CACHE_KEY_PREFIX = 'actor_'
def get_actor_info(actor_id):
cache_key = f'{ACTOR_CACHE_KEY_PREFIX}{actor_id}'
производительность должна быть сопоставима с '{}{}'.format(ACTOR_CACHE_KEY_PREFIX, actor_id)
, но, возможно, более читаемый.