Comment puis-je inclure des caractères spéciaux (tabulation, saut de ligne) dans un python doctest chaîne de résultat?
Donné le script python ci:
# dedupe.py
import re
def dedupe_whitespace(s,spacechars='\t '):
"""Merge repeated whitespace characters.
Example:
>>> dedupe_whitespace(r"Green\t\tGround") # doctest: +REPORT_NDIFF
'Green\tGround'
"""
for w in spacechars:
s = re.sub(r"("+w+"+)", w, s)
return s
La fonction fonctionne comme prévu dans l'interpréteur python:
$ python
>>> import dedupe
>>> dedupe.dedupe_whitespace('Purple\t\tHaze')
'Purple\tHaze'
>>> print dedupe.dedupe_whitespace('Blue\t\tSky')
Blue Sky
Cependant, la doctest exemple échoue parce que les caractères de tabulation sont converties en espaces avant comparaison à la chaîne de résultat:
>>> import doctest, dedupe
>>> doctest.testmod(dedupe)
donne
Failed example:
dedupe_whitespace(r"Green Ground") #doctest: +REPORT_NDIFF
Differences (ndiff with -expected +actual):
- 'Green Ground'
? -
+ 'Green Ground'
Comment puis-je encoder les caractères de tabulation dans un doctest heredoc chaîne, de sorte que le résultat d'un test de comparaison est réalisée de manière appropriée?
Vous devez vous connecter pour publier un commentaire.
J'ai eu à travailler à l'aide de chaîne littérale de notation pour la docstring:
C'est le raw heredoc notation de chaîne de caractères (
r"""
) qui a fait le tour:C'est fondamentalement YatharhROCK de réponse, mais un peu plus explicite. Vous pouvez utiliser des chaînes de ou double échappement. Mais pourquoi?
Vous avez besoin de la chaîne de caractères littérale de contenir valide le code Python qui, lorsqu'il est interprété, le code que vous voulez exécuter/test. Ces deux travaux:
L'effet de l'utilisation de chaînes brutes et de l'effet de la double-échappement (escape le slash) les deux feuilles dans la chaîne de deux caractères, le slash et le n de. Ce code est transmis à l'interpréteur Python, qui prend "slash alors n" signifie "caractère de saut de ligne" à l'intérieur d'une chaîne de caractères littérale.
Utilisez celle que vous préférez.
Vous devez définir la NORMALIZE_WHITESPACE.
Ou, alternativement, la capture de la sortie et de la comparer à la valeur attendue:De la
doctest
section documentation Comment sont Docstring Exemples Reconnu?:Edit: Mon erreur, j'ai compris la documentation dans l'autre sens. Les onglets sont en train d'être étendu à 8 espaces à la fois de la chaîne argument passé à
dedupe_whitespace
et le littéral de chaîne en cours par rapport à la ligne suivante, de sorteoutput
contient:et est comparé:
Je ne peux pas trouver un moyen de surmonter cette limitation sans écrire votre propre
DocTestParser
ou de test pour dédupliquées des espaces à la place des onglets.in __main__.dedupe_whitespace Failed example: output == 'Black Ground' Expected: True Got: False
r"""
empêche onglet expansion, à la fois dans l'expression de test et le résultat du test de chaîne littérale.TL;DR: Échapper à la barre oblique inverse, c'est à dire, utiliser
\\n
ou\\t
au lieu de\n
ou\t
dans votre autrement modifiées chaînes;Vous ne voulez probablement pas à faire votre docstrings cru que vous ne serez pas en mesure d'utiliser l'un de chaîne Python échappe, y compris ceux que vous pourriez vouloir.
Pour une méthode qui prend en charge l'utilisation normale échappe, juste d'échapper à la barre oblique inverse dans la barre oblique caractères d'échappement ainsi, après Python interprète, il laisse un backslash suivi par le personnage qui
doctest
peut analyser.Je l'ai eu à travailler pour s'évader le caractère de tabulation dans la chaîne attendue:
au lieu de