python中的类和方法

时间:2012-06-27 06:52:59

标签: python class function testing python-2.7

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。

2 个答案:

答案 0 :(得分:3)

在定义函数之前,您似乎正在运行测试。 Python中的函数定义是可执行语句,与其他语句一样,按照它们遇到的顺序执行。由于您在定义unittest.main()之前调用qsort,因此在运行测试时未定义qsort。在unittest.main()阻止后移动def qsort来电。

当你在这里时,最好不要将def置于if __name__=="__main__"区块内。通常,if块将是程序中的最后一位。只是做

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与任何内容都不是“同一类”。它不属于任何阶级。这只是一个功能。

答案 1 :(得分:1)

if __name__...处的dedent表示类定义的结束。你应该将这两行移到底部,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