2012-06-27 3 views
0
import unittest 
from paycheck import with_checker 

class TestStrings(unittest.TestCase):   
    @with_checker([int]) 
    def test_sort(self, list_of_ints): 
     self.assertTrue(isinstance(list_of_ints, list)) 
     self.assertTrue(len(list_of_ints) == len(qsort(list_of_ints))) 
     self.assertTrue(False) 


if __name__ == '__main__': 
    unittest.main() 

    def qsort (list): 
     if list == []: 
      return [] 
     else: 
      pivot = list [0] 
      lesser = qsort([x for x in list[1:] if x<pivot]) 
      greater = qsort([x for x in list[1:] if x>=pivot]) 
      return lesser + [pivot] + greater 

Cela me donne global name qsort not defined (même si je l'ai dans la même classe). Quel est le problème ici? Je suppose que c'est simple, mais je ne suis pas encore très familier avec Python.classes et méthodes en python

+0

Je crois qu'il ya une raison d'utiliser votre propre 'qsort' au lieu de' trié de Python() ' –

Répondre

3

Il semble que vous exécutiez les tests avant de définir la fonction. Les définitions de fonctions dans Python sont des instructions exécutables comme les autres et sont exécutées dans l'ordre où elles sont rencontrées. Puisque vous appelez unittest.main() avant de définir qsort, qsort n'est pas défini lorsque le test est exécuté. Déplacez votre appel unittest.main() après le bloc def qsort.

Pendant que vous y êtes, il est préférable de ne pas mettre le def dans le bloc if __name__=="__main__" de toute façon. Habituellement que si bloc sera le dernier bit dans votre programme. Faites simplement

def qsort (list): 
    if list == []: 
     return [] 
    else: 
     pivot = list [0] 
     lesser = qsort([x for x in list[1:] if x<pivot]) 
     greater = qsort([x for x in list[1:] if x>=pivot]) 
     return lesser + [pivot] + greater 

if __name__ == '__main__': 
    unittest.main() 

Notez également que qsort n'est pas "dans la même classe" que tout. Ce n'est dans aucune classe. C'est juste une fonction.

+0

Merci, je pense que je devrait lire les fonctions en python provenant d'un arrière-plan Java :) –

1

Le paramètre dedent à if __name__... indique la fin de la définition de classe. Vous devez déplacer ces deux lignes vers le bas, qsort fait maintenant partie de votre classe

import unittest 
from paycheck import with_checker 

class TestStrings(unittest.TestCase):   
    @with_checker([int]) 
    def test_sort(self, list_of_ints): 
     self.assertTrue(isinstance(list_of_ints, list)) 
     self.assertTrue(len(list_of_ints) == len(qsort(list_of_ints))) 
     self.assertTrue(False) 

    def qsort (list): 
     if list == []: 
      return [] 
     else: 
      pivot = list [0] 
      lesser = qsort([x for x in list[1:] if x<pivot]) 
      greater = qsort([x for x in list[1:] if x>=pivot]) 
      return lesser + [pivot] + greater 

if __name__ == '__main__': # move these two lines 
    unittest.main()   # to the bottom 
+1

Si vous déplacez 'qsort' dans la classe, vous avez besoin de' self' quand vous l'appelez de l'intérieur. – Matthias

+0

@ Matthias, Vrai. Je ne ferai pas ces changements ici car cela ne répond pas à la question immédiate. –

+0

Eh bien je suppose que c'est un peu, car je reçois toujours le NameError si je l'ai sur le même niveau d'indentation que le test, si je le mets à "indentation 0" je ne reçois aucune erreur et ça marche, –