2015-09-16 2 views
0

Supposons que nous ayons la fonction ci-dessous:Prévenir doctest échec incorrect lorsque la sortie non ordonnée est impliqué

def f(x): 
    """ 
    Turns x into a set. 

    >>> given_x = ['a', 'b', 'c', 'd', 'e', 'f'] 
    >>> f(given_x) 
    {'a', 'b', 'c', 'd', 'e', 'f'} 

    """ 

    return set(x) 

Exécution de l'doctest sera (en général) faire quelque chose comme ceci:

Failure 
********************************************************************** 
File "/home/black/Dev/exp_2.py", line 6, in f 
Failed example: 
    f(given_x) 
Expected: 
    {'a', 'b', 'c', 'd', 'e', 'f'} 
Got: 
    {'d', 'e', 'f', 'c', 'a', 'b'} 

Apparemment, ce shouldn échec » Il s'est passé depuis que la fonction fonctionne comme prévu, mais c'est parce que le résultat est non ordonné.


La sortie de ma fonction réelle peut être beaucoup plus complexe. Ça pourrait être une dictée avec des dicts, des décors, des listes à l'intérieur.

J'ai besoin d'une solution générale (s'il y en a une). Simplement sort() sur l'exemple présenté ne résoudrait pas mon problème de cas réel.

Question:
Comment puis-je empêcher le doctest de (à tort) à défaut lorsque la sortie est impliquée non ordonnée?

Répondre

4

Pourquoi ne pas simplement déplacer la sortie attendue afin de tester l'égalité, avec une sortie attendue de "True"?

def f(x): 
    """ 
    Turns x into a set. 

    >>> given_x = ['a', 'b', 'c', 'd', 'e', 'f'] 
    >>> f(given_x) == {'a', 'b', 'c', 'd', 'e', 'f'} 
    True 
    """ 

    return set(x) 

sortie:

Trying: 
    given_x = ['a', 'b', 'c', 'd', 'e', 'f'] 
Expecting nothing 
ok 
Trying: 
    f(given_x) == {'a', 'b', 'c', 'd', 'e', 'f'} 
Expecting: 
    True 
ok 
+0

Cette solution fonctionne pour les objets mais pas pour tester les fonctions qui retournent des chaînes. Cas du monde réel: générer une sortie html. Html ne se soucie pas de l'ordre des attributs, il est donc logique de représenter attr dans un dict() pour le rendu ultérieur. Lorsque vous essayez de doctest la fonction render() l'ordre d'attribut dans la chaîne n'est pas prévisible. –

0

La commande n'est pas garantie en python, donc vous ne pouvez pas compter dessus.

je forcer à avoir quelque chose que vous pouvez faire confiance:

>>> given_x = ['z','a', 'a', 'b', 'c', 'd', 'e', 'f'] 
>>> type(f(given_x)) 
<type 'dict'> 
>>> sorted(list(f(given(x))) 
['a', 'b', 'c', 'd', 'e', 'f','z'] 

je test qu'il a prévu le type, qu'il a fait la « singularité » de l'ensemble et le résultat est ce que j'attends

+0

Je suis désolé, je l'ai mentionné ma 'f()' sortie est beaucoup plus complexe. Voir la question mise à jour pour plus de détails. Je cherche une solution générale (s'il y en a une), pas une solution spécifique à l'exemple de la question. –