gpt4 book ai didi

python - 如何避免从元类派生的动态生成的类最终不会成为同一个类?

转载 作者:太空宇宙 更新时间:2023-11-03 17:50:02 24 4
gpt4 key购买 nike

我想做的是对一个函数执行数百个单元测试,我可以从字典中派生出该函数。不幸的是,我无法使用任何现有的包进行参数化测试(如 Nose ),所以我试图找到自己的解决方案。

我使用以下示例代码的目的是创建 3 个类(每个测试一个),这些类将存在于全局范围内,以便单元测试可以选择它并运行相应的测试。

tests = [
{'text': 'text1fdskla3fsda4',
'result': [1, 3, 4],
},
{'text': 'fdsg45tg5b',
'result': [4, 5, 5,5 ],
},
{'text': 'fsddf4',
'result': [4, 2],
}
]

def evaluate(text):
out = []
for char in text:
if char.isdigit():
out.append(int(char))
return out

class TestMeta(type):
def __new__(cls, name, bases, attrs):
name = str(test['text'])
return type.__new__(cls, name, (unittest.TestCase,), attrs)

for test in tests:
class T(object):
__metaclass__ = TestMeta
def testOne(self):
self.assertEqual(test['result'], evaluate(test['text']))
globals()[(test['text'])] = copy.deepcopy(T)

unittest.main()

当我运行上面的代码时,我得到了四个单元测试,这比预期多了一个,但最重要的是,我创建的类似乎总是相同的,而不是每个单元测试的输出(即使我实际上为每个设置了不同的名称和参数):

======================================================================
FAIL: testOne (__main__.fsddf4)
----------------------------------------------------------------------
Traceback (most recent call last):
File "ble.py", line 45, in testOne
self.assertEqual(test['result'], evaluate(test['text']))
AssertionError: [4, 2] != [4]

======================================================================
FAIL: testOne (__main__.fdsg45tg5b)
----------------------------------------------------------------------
Traceback (most recent call last):
File "ble.py", line 45, in testOne
self.assertEqual(test['result'], evaluate(test['text']))
AssertionError: [4, 2] != [4]

======================================================================
FAIL: testOne (__main__.fsddf4)
----------------------------------------------------------------------
Traceback (most recent call last):
File "ble.py", line 45, in testOne
self.assertEqual(test['result'], evaluate(test['text']))
AssertionError: [4, 2] != [4]

======================================================================
FAIL: testOne (__main__.text1fdskla3fsda4)
----------------------------------------------------------------------
Traceback (most recent call last):
File "ble.py", line 45, in testOne
self.assertEqual(test['result'], evaluate(test['text']))
AssertionError: [4, 2] != [4]

----------------------------------------------------------------------
Ran 4 tests in 0.002s

FAILED (failures=4)

deepcopy 试图获得不同的输出,但没有帮助。在全局字典中显式创建类是因为简单地在 for 循环上创建类只会产生一个单元测试。

最佳答案

除了对元一切进行深入尝试之外,您还会遇到一个典型的 Python 初学者问题:全局名称查找是在运行时完成的。

所以,在你的代码中:

for test in tests:
class T(object):
__metaclass__ = TestMeta
def testOne(self):
self.assertEqual(test['result'], evaluate(test['text']))

testOne运行时,它会在globals字典中查找test当时——时间它运行——当然,此时test被设置为最近设置的值。

您需要强制绑定(bind)更早发生,您可以通过简单地更改来做到这一点

        def testOne(self):

进入

        def testOne(self, test=test):

此更改强制在 def 执行时查找全局 test(而不是稍后的 body该方法执行),这与 class 语句执行的时间相同——即,当全局变量 test 设置为当前项时,循环的每个分支执行一次列出测试

关于python - 如何避免从元类派生的动态生成的类最终不会成为同一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29246785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com