Délicate chaîne de python littéraux dans le passage de paramètres à la fonction de timeit.Timer ()

StackOverflow https://stackoverflow.com/questions/386664

  •  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

Était-ce utile?

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")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top