Сложные строковые литералы Python при передаче параметра timeit.Функция Timer()

StackOverflow https://stackoverflow.com/questions/386664

  •  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")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top