2009-08-10 6 views
2

Quand je lance doctests sur différentes versions de Python (2,5 vs 2,6) et différents Plateformes de (FreeBSD vs Mac OS) Les chaînes vous cite différemment:chaîne questions citant dans doctests

Failed example: 
    decode('{"created_by":"test","guid":123,"num":5.00}') 
Expected: 
    {'guid': 123, 'num': Decimal("5.00"), 'created_by': 'test'} 
Got: 
    {'guid': 123, 'num': Decimal('5.00'), 'created_by': 'test'} 

donc sur une boîte rééd (décimal. Decimal ('5.00')) se traduit par 'Decimal ("5.00")' sur l'autre dans "Decimal ('5.00')". Existe-t-il un moyen de contourner le problème sans créer une logique de test plus compliquée?

Répondre

4

Ceci est en fait parce que le code source du module decimal a changé: en Python 2.4 et python2.5 la fonction decimal.Decimal.__repr__ contient:

return 'Decimal("%s")' % str(self) 

alors qu'en python2.6 il contient:

return "Decimal('%s')" % str(self) 

Donc, dans ce cas, la meilleure chose à faire est juste d'imprimer str() du résultat et vérifier le type séparément si nécessaire ...

+0

Merci pour l'explication. Malheureusement, j'ai aussi beaucoup de dictionnaires comme valeur de retour, donc comparer juste str() ne fonctionnera pas. J'ai édité, y question en conséquence. – max

+0

Ah, dans ce cas, il peut être mieux pour vous de regarder les tests unitaires réels pas seulement les doctests ... les doctests deviennent trop compliqués quand vous traitez des complexités comme ceci IMHO –

0

Suite aux résultats par D avid Fraser j'ai trouvé this suggestion par Raymond Hettinger sur la mailinglist Python.

Je vais maintenant utiliser quelque chose comme ceci:

import sys 
if sys.version_info[:2] <= (2, 5): 
    # ugly monkeypatch to make doctests work. For the reasons see 
    # See http://mail.python.org/pipermail/python-dev/2008-July/081420.html 
    # It can go away once all our boxes run python > 2.5 
    decimal.Decimal.__repr__ = lambda s: "Decimal('%s')" % str(s)