2012-06-27 39 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'而不是原因Python的'排序()' –

回答

3

看起來您在定義函數之前正在運行測試。 Python中的函數定義與其他任何可執行語句一樣,並按照遇到的順序執行。由於您在定義qsort之前致電unittest.main(),因此運行測試時未定義qsort。在def qsort區塊後移動您的unittest.main()電話。

雖然你在這裏,但最好不要把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

謝謝,我想我應該閱讀來自Java背景的python中的函數:) –

1

if __name__...的縮進表示類定義的結束。你應該將這兩行至底部,快速排序,現在是你的類的一部分

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,真的。我不會在這裏做出這些改變,因爲它沒有解決當前的問題。 –

+0

嗯,我想它有點確實,因爲我仍然得到NameError,如果我把它放在與測試相同的縮進級別上,如果我把它放在「縮進0」處,我就沒有錯誤並且它可以工作, –