2012-06-27 4 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 

Это дает мне global name qsort not defined (даже если у меня его один класс). В чем проблема? Полагаю, это просто, но я еще не очень хорошо знаком с Python.классы и методы в python

+0

Я думаю, есть причина для использования самостоятельно 'qsort' вместо Питона' отсортирован() ' –

ответ

3

Похоже, вы используете тесты перед тем, как определить функцию. Определения функций в Python являются исполняемыми операторами, как и любые другие, и выполняются в том порядке, в котором они встречаются. Поскольку вы вызываете unittest.main(), прежде чем вы определяете qsort, qsort не определяется при запуске теста. Переместите ваш вызов unittest.main() после блока def qsort.

В то время как вы на нем, лучше не ставить def внутри блока if __name__=="__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 

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

Также обратите внимание, что qsort не является «в том же классе», что и все. Это не в любом классе. Это просто функция.

+0

Спасибо, я думаю, что я должен читать функции в python, исходящие из фона Java :) –

1

Отступ в if __name__... означает конец определения класса. Вы должны переместить эти две строки в нижней части, QSort теперь является частью вашего класса

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

Если вы переместите 'qsort' в класс, который вам нужно' self' при вызове изнутри. – Matthias

+0

@ Matthias, True. Я не буду вносить эти изменения здесь, поскольку он не затрагивает ближайший вопрос. –

+0

Ну, я думаю, это немного, так как я все еще получаю NameError, если у меня есть тот же уровень отступов, что и тест, если я помещаю его в «indentation 0», я не получаю ошибки и работает, –

Смежные вопросы