Tricky Python Stringliterale nebenbei Parameter timeit.Timer () -Funktion
-
23-08-2019 - |
Frage
Ich bin in Python eine harte Zeit mit der Setup-Anweisung mit timeit.Timer (stmt, setup_stmt). Ich schätze jede Hilfe mich dieses heikelen Problems heraus zu bekommen:
Also meine Sniplet wie folgt aussehen:
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))
Ich weiß nicht, wie die metacharacter in den Variablen str1 zu entkommen, STR2, ohne ihre Bedeutung in der Setup-Anweisung zu ändern:
"from __main__ import compare; p1=%s, p2=%s" % (str1,str2)
Ich habe versucht, verschiedene Kombinationen, aber immer haben die folgenden Fehler:
Syntaxerror: kann nicht auf wörtliche
zuweisen
Syntaxerror: EOL beim Scannen Strings in einfachen Anführungszeichen
Syntaxerror: invalid syntax
Lösung
Betrachten Sie diese als Alternative.
t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%r; p2=%r" % (str1,str2))
Die %r
verwendet die repr für die Zeichenfolge, die Python immer zitiert und entkommt richtig.
EDIT: Fest Code durch ein Komma zu einem Semikolon zu ändern; der Fehler ist jetzt weg.
Andere Tipps
Warum sich die Mühe die Saiten überhaupt zu zitieren? Verwenden Sie sie einfach direkt. dh. ändern Ihre letzte Zeile:
t = timeit.Timer('compare(str1, str2)', "from __main__ import compare, str1, str2")