Сложные строковые литералы Python при передаче параметра timeit.Функция Timer()
-
23-08-2019 - |
Вопрос
У меня возникли трудности с инструкцией setup в Python timeit.Timer(stmt, setup_stmt).Я ценю любую помощь, чтобы вытащить меня из этой сложной проблемы:
Итак, мой сниплет выглядит следующим образом:
def compare(string1, string2):
# compare 2 strings
if __name__ = '__main__':
str1 = "This string has \n several new lines \n in the middle"
str2 = "This string hasn't any new line, but a single quote ('), in the middle"
t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%s, p2=%s" % (str1,str2))
Я не знаю, как избежать метасимвола в переменной str1, str2 без изменения их значения в инструкции setup:
"from __main__ import compare; p1=%s, p2=%s" % (str1,str2)
Я пробовал различные комбинации, но всегда получаю следующие ошибки:Синтаксическая ошибка:не удается присвоить литералу
Синтаксическая ошибка:EOL при сканировании строки, заключенной в одинарные кавычки
Синтаксическая ошибка:недопустимый синтаксис
Решение
Рассматривайте это как альтернативу.
t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%r; p2=%r" % (str1,str2))
В %r
использует repr для строки, которую Python всегда заключает в кавычки и корректно экранирует.
Редактировать:Исправлен код путем замены запятой на точку с запятой;теперь ошибка устранена.
Другие советы
Зачем вообще утруждать себя цитированием строк?Просто используйте их напрямую.т. е.измените свою последнюю строку на:
t = timeit.Timer('compare(str1, str2)', "from __main__ import compare, str1, str2")