Tricky strings literais Python em passar parâmetro para timeit.Timer () função
-
23-08-2019 - |
Pergunta
Eu estou tendo um momento difícil com a afirmação de configuração em Python timeit.Timer (stmt, setup_stmt). Agradeço qualquer ajuda para me tirar deste problema complicado:
Assim, meus sniplet esta aparência:
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))
Eu não sei como escapar da metacharacter na str1 variável, str2, sem alterar o seu significado na demonstração de configuração:
"from __main__ import compare; p1=%s, p2=%s" % (str1,str2)
Eu tentei várias combinações, mas sempre tem os seguintes erros:
SyntaxError: não é possível atribuir a literal
SyntaxError: EOL durante a digitalização de corda
único citado
SyntaxError: inválido sintaxe
Solução
Pense nisto como uma alternativa.
t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%r; p2=%r" % (str1,str2))
O %r
usa o repr para a cadeia, que Python sempre citações e escapa corretamente.
EDIT: código fixo, mudando uma vírgula para um ponto e vírgula; o erro é ido agora.
Outras dicas
Por que se preocupar citando as cordas em tudo? Apenas usá-los diretamente. ie. mudar a sua última linha para:
t = timeit.Timer('compare(str1, str2)', "from __main__ import compare, str1, str2")