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 还不是很熟悉。

4

2 回答 2

3

看起来您在定义函数之前正在运行测试。Python 中的函数定义与其他任何语句一样是可执行语句,并按照遇到的顺序执行。由于您unittest.main()在定义之前调用qsortqsort因此在运行测试时未定义。将您的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 与任何东西都不“在同一类”。它不在任何班级。这只是一个功能。

于 2012-06-27T06:55:07.990 回答
1

atif __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
于 2012-06-27T07:00:14.917 回答