Python 使副作用迭代器从“循环”;“从开始到结束”&引用;“一遍又一遍”;

Python 使副作用迭代器从“循环”;“从开始到结束”&引用;“一遍又一遍”;,python,mocking,python-2.7,Python,Mocking,Python 2.7,我必须说我是新来的python mock。 我有一个副作用迭代器: myClass.do.side_effect = iter([processStatus, memoryStatus, processStatus, memoryStatus, processStatus, memoryStatus, processStatus, memoryStatus]) 以上工作正常,测试用例通过 但我正在寻找一种更好的方式来写这篇文章。 我尝试了[…]*4,但没有成功 我该怎么做?简单地说,一旦迭代器

我必须说我是新来的python mock。 我有一个副作用迭代器:

myClass.do.side_effect = iter([processStatus, memoryStatus, processStatus, memoryStatus, processStatus, memoryStatus, processStatus, memoryStatus])
以上工作正常,测试用例通过

但我正在寻找一种更好的方式来写这篇文章。 我尝试了
[…]*4
,但没有成功


我该怎么做?简单地说,一旦迭代器结束,就让它从头开始。

我想你可以在这里使用
itertools.cycle
,如果你想“反复”的话:

>>> s = range(3)
>>> s
[0, 1, 2]
>>> from itertools import cycle
>>> c = cycle(s)
>>> c
<itertools.cycle object at 0xb72697cc>
>>> [next(c) for i in range(10)]
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0]
>>> c = cycle(['pS', 'mS'])
>>> [next(c) for i in range(10)]
['pS', 'mS', 'pS', 'mS', 'pS', 'mS', 'pS', 'mS', 'pS', 'mS']

但正如评论中所指出的,
iter([1,2,3]*n)
也应该可以工作。

我认为你可以在这里使用
itertools.cycle
,如果你想“反复”的话:

>>> s = range(3)
>>> s
[0, 1, 2]
>>> from itertools import cycle
>>> c = cycle(s)
>>> c
<itertools.cycle object at 0xb72697cc>
>>> [next(c) for i in range(10)]
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0]
>>> c = cycle(['pS', 'mS'])
>>> [next(c) for i in range(10)]
['pS', 'mS', 'pS', 'mS', 'pS', 'mS', 'pS', 'mS', 'pS', 'mS']

但正如评论中所指出的,
iter([1,2,3]*n)
也应该能工作。

@AshwiniChaudhary,感觉像是一个肮脏的黑客。我需要做几次。什么是
processStatus
?函数?有状态的东西吗?我有点惊讶于
iter([pS,mS]*4)
不能工作。@DSM这些是模拟函数的输出参数。我得到的错误是迭代器不能与整数值相乘。@Alborz——这是因为您编写的是
iter([…])*4
,而不是
iter([…]*4)
——迭代器不能与整数相乘,但列表可以。所以,你只需从一个较长的列表中生成一个迭代器,就可以了。但是,如果DSM undelete是他的答案,
itertools.cycle
itertools.repeat
可能是一种更好的方法。@mgilson,谢谢它与[…]*4一起工作,但现在有一个常数我不喜欢;)你能详细介绍一下itertools的使用吗?重复@AshwiniChaudhary,那感觉像一个肮脏的黑客。我需要做几次。什么是
processStatus
?函数?有状态的东西吗?我有点惊讶于
iter([pS,mS]*4)
不能工作。@DSM这些是模拟函数的输出参数。我得到的错误是迭代器不能与整数值相乘。@Alborz——这是因为您编写的是
iter([…])*4
,而不是
iter([…]*4)
——迭代器不能与整数相乘,但列表可以。所以,你只需从一个较长的列表中生成一个迭代器,就可以了。但是,如果DSM undelete是他的答案,
itertools.cycle
itertools.repeat
可能是一种更好的方法。@mgilson,谢谢它与[…]*4一起工作,但现在有一个常数我不喜欢;)你能详细介绍一下itertools的使用吗?重复!我尝试了这个方法,效果很好,但我需要调用next()。我需要一个循环迭代器来提供给side_effect函数。cycle对象是一个循环迭代器<代码>周期([pS,mS])就像
iter([pS,mS]*4)
但是它不是4而是无穷大。我刚刚使用了
next
来提取一些值(我也可以使用
itertools.islice
),非常感谢。我使用此方法模拟GoogleAppClient,因为其中一个客户端需要一个
nextPageToken
(bool)来停止迭代,除非代码嵌入到另一个嵌套循环中,否则这是可以的。我尝试了这个方法,它可以工作,但我需要调用next()。我需要一个循环迭代器来提供给side_effect函数。cycle对象是一个循环迭代器<代码>周期([pS,mS])就像
iter([pS,mS]*4)
但是它不是4而是无穷大。我刚刚使用了
next
来提取一些值(我也可以使用
itertools.islice
),非常感谢。我使用这个方法来模拟GoogleAppClient,因为其中一个客户端需要一个
nextPageToken
(bool)来停止迭代,除非代码嵌入到另一个嵌套循环中,否则这是很好的。