Сложные строковые литералы Python при передаче параметра в функцию timeit.Timer () - PullRequest
4 голосов
/ 22 декабря 2008

У меня проблемы с оператором установки в 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, не меняя их значения в операторе настройки:

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

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

Ответы [ 2 ]

6 голосов
/ 22 декабря 2008

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

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

%r использует repr для строки, которую Python всегда цитирует и правильно экранирует.

РЕДАКТИРОВАТЬ: исправлен код путем замены запятой на точку с запятой; ошибка исчезла.

2 голосов
/ 23 декабря 2008

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

t = timeit.Timer('compare(str1, str2)', "from __main__ import compare, str1, str2")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...