gpt4 book ai didi

python - 测试函数在 python 中返回可迭代

转载 作者:太空狗 更新时间:2023-10-29 21:01:32 24 4
gpt4 key购买 nike

我在测试 python 函数时遇到困难返回一个可迭代的,就像函数yielding 或函数只返回一个可迭代对象,比如 return imap(f, some_iter)return permutations([1,2,3]) .

因此对于排列示例,我希望函数的输出为 [(1, 2, 3), (1, 3, 2), ...] .因此,我开始测试我的代码。

def perm3():
return permutations([1,2,3])

# Lets ignore test framework and such details
def test_perm3():
assertEqual(perm3(), [(1, 2, 3), (1, 3, 2), ...])

这行不通,因为 perm3()是可迭代的,而不是列表。所以我们可以修复这个特定的例子。

def test_perm3():
assertEqual(list(perm3()), [(1, 2, 3), (1, 3, 2), ...])

这很好用。但是如果我有嵌套的迭代对象呢?那是可迭代产生可迭代?喜欢说表情 product(permutations([1, 2]), permutations([3, 4])) .现在这是可能没有用,但很明显它会(一旦展开迭代器)类似于 [((1, 2), (3, 4)), ((1, 2), (4, 3)), ...] .但是,我们不能只包装 list围绕我们的结果,因为那只会转iterable<blah>[iterable<blah>, iterable<blah>, ...] .出色地我当然可以做map(list, product(...)) ,但这只适用于嵌套级别为 2。

那么,python测试社区有什么解决方案吗?测试可迭代对象时出现问题?自然有些迭代不能以这种方式进行测试,就像你想要一个无限生成器一样,但是这个问题仍然很普遍,以至于有人会想到关于这个。

最佳答案

我使用 KennyTM's assertRecursiveEq :

import unittest
import collections
import itertools

class TestCase(unittest.TestCase):
def assertRecursiveEq(self, first, second, *args, **kwargs):
"""
https://stackoverflow.com/a/3124155/190597 (KennyTM)
"""
if (isinstance(first, collections.Iterable)
and isinstance(second, collections.Iterable)):
for first_, second_ in itertools.izip_longest(
first, second, fillvalue = object()):
self.assertRecursiveEq(first_, second_, *args, **kwargs)
else:
# If first = np.nan and second = np.nan, I want them to
# compare equal. np.isnan raises TypeErrors on some inputs,
# so I use `first != first` as a proxy. I avoid dependency on numpy
# as a bonus.
if not (first != first and second != second):
self.assertAlmostEqual(first, second, *args, **kwargs)

def perm3():
return itertools.permutations([1,2,3])

class Test(TestCase):
def test_perm3(self):
self.assertRecursiveEq(perm3(),
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)])

if __name__ == '__main__':
import sys
sys.argv.insert(1, '--verbose')
unittest.main(argv = sys.argv)

关于python - 测试函数在 python 中返回可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643762/

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