literales de cadena Python difícil en pasar parámetro para timeit.Timer () función
-
23-08-2019 - |
Pregunta
Estoy teniendo un tiempo duro con la frase de preparación en Python timeit.Timer (stmt, setup_stmt). Agradezco cualquier ayuda que me saque de este problema complicado:
Así que mi sniplet se ve así:
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))
No sé cómo escapar de la metacarácter en el str1 variables, str2 sin cambiar su significado en la frase de preparación:
"from __main__ import compare; p1=%s, p2=%s" % (str1,str2)
He intentado varias combinaciones, pero siempre tienen los siguientes errores:
SyntaxError: no se puede asignar a literal
SyntaxError: EOL durante la exploración entre comillas simples cadena
SyntaxError: no válido
Solución
Considere esto como una alternativa.
t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%r; p2=%r" % (str1,str2))
El %r
utiliza la repr para la cadena, que cita a Python siempre y escapa correctamente.
EDIT: Código fijo cambiando una coma a un punto y coma; el error se ha ido.
Otros consejos
¿Por qué molestarse citando las cuerdas en absoluto? Sólo tiene que utilizar directamente. es decir. cambiar la última línea a:
t = timeit.Timer('compare(str1, str2)', "from __main__ import compare, str1, str2")