【问题标题】:Nested function as attribute in Python嵌套函数作为Python中的属性
【发布时间】:2013-02-27 02:23:07
【问题描述】:

不确定这是否是骗局。就这样吧。

我需要编写一些 Python 代码,如下所示:

class TestClass:
    def test_case(self):
     def get_categories(self):
      return [“abc”,”bcd”]
     # do the test here

然后有一个测试引擎类扫描所有这些测试类,加载所有 test_case 函数,并为每个调用 get_categories 来确定测试是否属于特定运行的感兴趣组。

问题是 get_categories 不被视为 test_case 的属性,即使我手动分配它

class TestClass:
    def test_case(self):
     def get_categories(self):
      return [“abc”,”bcd”]
     # do the test here
     test_case.get_categories = get_categories

这只会在 test_case 首次运行时发生,对我来说太晚了。

这个函数不能在类上运行(或者至少我希望它在每个函数级别也可用)的原因是一个 TestClass 可以有多个测试用例。 由于这是一个已经存在的测试基础架构,并且类别机制有效(除了不太重要的类别功能场景),因此计划中没有重写。

非常感谢语言技巧。

【问题讨论】:

    标签: python unit-testing python-2.7


    【解决方案1】:

    嵌套函数不会像任何其他赋值一样成为属性。

    如果不支持(并且使用旧式类!),我怀疑您的测试基础架构会做一些非常奇怪的事情,但您可以这样做:

    class TestClass:
        def test_case(self):
            # ...
    
        def _get_categories(self):
            return [...]
        test_case.get_categories = _get_categories
        del _get_categories
    

    类主体是与任何其他块一样的可执行代码。

    【讨论】:

      【解决方案2】:

      您需要的是嵌套类。函数不是用来做你想做的事,所以你必须提高一个档次。函数属性主要用作标记,而类可以有任何你想要的。

      class TestClass(object):
          class TestCase(object):
               @classmethod
               def get_categories(cls):
                   return ['abc', 'efg']
      

      请注意,我使用了@classmethod,这样您就可以在不实例化TestCase() 的情况下使用它;修改如果你想做test_case = TestCase()

      【讨论】:

      • 优雅而干净,但我不会为了一个小功能而对已经存在约 700 次测试的现有基础架构进行如此大的改变 :)
      猜你喜欢
      • 1970-01-01
      • 2019-10-27
      • 2019-10-14
      • 2018-06-03
      • 2019-07-16
      • 2015-09-08
      • 1970-01-01
      • 2021-09-09
      • 2012-04-15
      相关资源
      最近更新 更多