如何解决错误:Zip参数1必须支持迭代

2024-05-15 00:09:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个问题相同的测试方法,以下是主类中的原始方法:

def get_num_words(self, word_part):
    """ 1 as default, may want 0 as an invalid case """
    if word_part[3] == '0a':
        self.num_words = 10
    else:
        self.num_words = int(word_part[3])
    return self.num_words

def get_num_pointers(self, before_at):
    self.num_pointers = int(before_at.split()[-1])
    return self.num_pointers

下面是两个测试类:

def test_get_num_words(self):
    word_part = ['13797906', '23', 'n', '04', 'flood', '0', 'inundation', '0', 'deluge', '0', 'torrent', '0', '005', '@', '13796604', 'n', '0000', '+', '00603894', 'a', '0401', '+', '00753137', 'v', '0302', '+', '01527311', 'v', '0203', '+', '02361703', 'v', '0101', '|', 'an', 'overwhelming', 'number', 'or', 'amount;', '"a', 'flood', 'of', 'requests";', '"a', 'torrent', 'of', 'abuse"']
    expected = 04
    real = self.wn.get_num_words(word_part)
    for r, a in zip(real, expected):
        self.assertEqual(r, a)

def test_get_num_pointers(self):
    before_at = '13797906 23 n 04 flood 0 inundation 0 deluge 0 torrent 0 005'
    expected = 5
    real = self.wn.get_num_pointers(before_at)
    for r, a in zip(real, expected):
        self.assertEqual(r, a)

这就是他们给出的错误:TypeError: zip argument #1 must support iteration 这个程序可以完全工作,只有两个测试在20个不同的测试中不起作用。


Tags: selfgetdefziptorrentrealnumat
3条回答

这个错误解释了发生的情况:zip的参数必须是iterable(即列表、元组或其他实际上可以遍历的内容)。你在传递整数。

我不知道你打电话给zip到底想做什么,但也许你只是想直接比较真实和预期?

你的测试应该是这样的:

def test_get_num_pointers(self):
    before_at = '13797906 23 n 04 flood 0 inundation 0 deluge 0 torrent 0 005'
    expected = 5
    real = self.wn.get_num_pointers(before_at)
    self.assertEqual(real, expected)

只有在断言多个值时才使用for循环才有意义。

您的gen_num_pointers()gen_num_words()方法返回一个整数。zip()只能处理序列(列表、集合、元组、字符串、迭代器等)

您根本不需要在这里调用zip();您正在对一个整数与另一个整数进行测试:

def test_get_num_words(self):
    word_part = ['13797906', '23', 'n', '04', 'flood', '0', 'inundation', '0', 'deluge', '0', 'torrent', '0', '005', '@', '13796604', 'n', '0000', '+', '00603894', 'a', '0401', '+', '00753137', 'v', '0302', '+', '01527311', 'v', '0203', '+', '02361703', 'v', '0101', '|', 'an', 'overwhelming', 'number', 'or', 'amount;', '"a', 'flood', 'of', 'requests";', '"a', 'torrent', 'of', 'abuse"']
    self.assertEqual(4, self.wn.get_num_words(word_part))

def test_get_num_pointers(self):
    before_at = '13797906 23 n 04 flood 0 inundation 0 deluge 0 torrent 0 005'
    self.assertEqual(5, self.wn.get_num_pointers(before_at))

足够了。

您还希望避免对整型文本使用前导004被解释为一个八进制数字;如果你不得不将这个数字改为使用更多的数字,或者使用0-7范围之外的数字,你会得到一个令人讨厌的惊喜:

>>> 010
8
>>> 08
  File "<stdin>", line 1
    08
     ^
SyntaxError: invalid token

相关问题 更多 >

    热门问题