Форматирование строки 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), но, возможно, более читаемый.