2016-01-05 2 views
9

Я разрабатываю приложение, в котором я выполняю некоторые запросы, чтобы получить идентификатор объекта. После каждого из них я вызываю метод (get_actor_info()), передавая этот id в качестве аргумента (см. Код ниже).Форматирование строки Python:% vs concatenation

ACTOR_CACHE_KEY_PREFIX = 'actor_' 

def get_actor_info(actor_id): 
    cache_key = ACTOR_CACHE_KEY_PREFIX + str(actor_id) 

Как можно заметить, я литья actor_id к string и конкатенации его с префиксом. Тем не менее, я знаю, что могу сделать это несколькими другими способами (например, .format() или '%s%d'), и это приводит к моему вопросу: будет ли '%s%d' лучше, чем конкатенация строк с точки зрения удобочитаемости, согласования кода и эффективности?

Благодаря

+0

Вы можете проверить сами: https://docs.python.org/2/library/timeit.html –

+1

Спасибо @brunodesthuilliers! Однако это отвечает только части эффективности времени вопроса. –

+2

Да, извините ... wrt/readability и conventions, ответ прост: используйте '.format()'. –

ответ

9

Это может легко стать основанной на мнениях нитью, но в большинстве случаев форматирование становится более читаемым и более удобным. Легче представить, как будет выглядеть финальная строка, не делая «умственной конкатенации». Какое из них более читаемо, например?

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 Documentation вскоре они могут быть удалены:

Поскольку str.format() является достаточно новым, много кода Python все еще использует оператор %. Однако, поскольку этот старый стиль форматирования в конечном итоге будет удален из языка, обычно следует использовать str.format().

Более поздние версии документации перестали упоминать об этом, но тем не менее .format() - путь будущего; используй это!

Конкатенация выполняется быстрее, но это не должно вызывать беспокойства. Сделайте свой код читабельным и поддерживаемым как цель первой линии, а затем оптимизируйте части, которые вам нужно оптимизировать позже. Преждевременная оптимизация есть корень всех зол;)

4

Concatenation лучше, когда речь идет о производительности. В вашем примере как конкатенация, так и подстановка являются читабельными, но когда дело доходит до более сложных шаблонов, замена выигрывает простоту и готовность к чтению.

Например, если у вас есть данные, и вы хотите показать их в html, конкатенация вызовет головную боль, а замена будет простой и удобочитаемой.

+0

Конкатенация * хуже * когда дело доходит до производительности. См. Https: // waymoot.org/home/python_string/и http://leadsift.com/python-string-concatenation/ – jalanb

2

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), но, возможно, более удобным для чтения.

Смежные вопросы