在将参数传递给 timeit.Timer() 函数时,Python 字符串文字的处理很棘手。

6

我在Python的timeit.Timer(stmt, setup_stmt)中遇到了setup语句的问题。我很感激任何帮助让我摆脱这个棘手的问题:

我的代码片段看起来像这样:

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)

我尝试了各种组合,但总是出现以下错误: 语法错误:不能将值赋给文字 语法错误:扫描单引号字符串时遇到行末 语法错误:无效语法
2个回答

7
考虑这个作为一个替代方案。
t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%r; p2=%r" % (str1,str2))

%r 使用 repr 来表示字符串,Python 总是能正确引用和转义。

编辑:通过将逗号改为分号修复了代码,现在错误已经消失。


我尝试了一下,但出现了SyntaxError: can't assign to literal。不管怎样还是谢谢你。 - Martin08
问题在于他放了一个逗号,而需要的是一个分号。使用现在的内容再试一次,它应该可以工作。 - Eli Courtwright

2
为什么要引用字符串?直接使用它们不就可以了吗?也就是说,将最后一行改为:
t = timeit.Timer('compare(str1, str2)', "from __main__ import compare, str1, str2")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接