Строковые литералы Tricky Python, передающие параметр timeit.Timer()

Мне сложно с инструкцией установки в Python timeit.Timer(stmt, setup_stmt). Я ценю любую помощь, чтобы избавить меня от этой сложной проблемы:

Итак, моя sniplet выглядит так:

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 без изменения их значения в инструкции установки:

"from __main__ import compare; p1=%s, p2=%s" % (str1,str2)

Я пробовал различную комбинацию, но всегда имел следующие ошибки: СинтаксисError: не может назначить буквальный SyntaxError: EOL при сканировании однокасканной строки СинтаксисError: недопустимый синтаксис

2 ответа

Рассмотрим это как альтернативу.

t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%r; p2=%r" % (str1,str2))

В %r используется выражение для строки, которое Python всегда цитирует и убегает правильно.

EDIT: фиксированный код, изменяя запятую на точку с запятой; ошибка исчезла.


Зачем вообще цитировать строки? Просто используйте их напрямую. то есть. измените свою последнюю строку на:

t = timeit.Timer('compare(str1, str2)', "from __main__ import compare, str1, str2")

licensed under cc by-sa 3.0 with attribution.