Délicate chaîne de python littéraux dans le passage de paramètres à la fonction de timeit.Timer ()
-
23-08-2019 - |
Question
Je suis un moment difficile avec l'instruction de configuration dans timeit.Timer (stmt, setup_stmt) Python. Je vous remercie de toute aide pour me sortir de ce problème délicat:
Alors mon sniplet ressemble à ceci:
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))
Je ne sais pas comment échapper à la métacaractère dans la variable str1, str2 sans changer leur sens dans l'énoncé de configuration:
"from __main__ import compare; p1=%s, p2=%s" % (str1,str2)
J'ai essayé diverses combinaisons, mais toujours les erreurs suivantes:
SyntaxError: ne peut pas attribuer à la lettre
SyntaxError: EOL lors de la numérisation chaîne entre guillemets simples
SyntaxError: syntaxe non valide
La solution
Considérez cela comme une solution de rechange.
t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%r; p2=%r" % (str1,str2))
Le %r
utilise le rééd pour la chaîne, qui cite Python toujours et échappe correctement.
EDIT: Code fixe en changeant une virgule à un point-virgule; l'erreur est maintenant disparu.
Autres conseils
Pourquoi prendre la peine de citer les cordes du tout? Il suffit de les utiliser directement. c'est à dire. changer votre dernière ligne à:
t = timeit.Timer('compare(str1, str2)', "from __main__ import compare, str1, str2")