Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python编写一个可恢复的循环_Python - Fatal编程技术网

用Python编写一个可恢复的循环

用Python编写一个可恢复的循环,python,Python,我有一个具有以下结构的测试: def test_foo(测试用例): 对于测试案例中的案例: 运行测试(案例) 每个run\u测试都相当慢,如果案例失败,再次调用测试将从头开始循环 因此,我将跟踪状态文件中最后一个失败的循环变量,如下所示: def test_foo(测试用例、状态文件): 状态dic=加载状态文件(状态文件) 对于itertools.dropwhile中的情况( lambda c:state_dic中的“foo”和state_dic[“foo”!=c, 测试用例): 州_di

我有一个具有以下结构的测试:

def test_foo(测试用例):
对于测试案例中的案例:
运行测试(案例)
每个
run\u测试都相当慢,如果案例失败,再次调用测试将从头开始循环

因此,我将跟踪状态文件中最后一个失败的循环变量,如下所示:

def test_foo(测试用例、状态文件):
状态dic=加载状态文件(状态文件)
对于itertools.dropwhile中的情况(
lambda c:state_dic中的“foo”和state_dic[“foo”!=c,
测试用例):
州_dic['foo']=案例
尝试:
运行测试(案例)
除例外情况外:
保存状态文件(状态dic,状态文件)
提升
州/地区流行语('foo',无)
保存状态文件(状态dic,状态文件)
我想知道是否有更通用的方法来实现从状态循环恢复。到目前为止,我得出的结论是:

def test_foo(测试用例、状态文件):
使用ResumableIterator(测试用例“foo”,状态文件)作为小写:
对于大小写:
运行测试(案例)

其中,
ResumableIterator
是一个上下文管理器,它将跟踪状态
'foo'
从/到
状态文件的加载和保存。它将生成一个由第一个参数构造的迭代器,该迭代器跟踪它发出的最后一个值,以便在循环异常发生时,它将最后发出的值保存在状态文件中。有更好的想法吗?

不确定这是否比您的上下文管理器方法更好,但它可能更简单,只需运行一次
,而不是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu进入和(通常很无聊的)

# python 3
class TestRunner:

    def __init__(self, *test_cases):
        self.queue = list(test_cases)

    def run(self):
        for i, case in enumerate(self.queue):
            try:
                run_test(case)
            except Exception as e:
                print(e)
                self.queue = self.queue[i:]
                break
为了演示的目的,让我们假设

def run_test(case):
    case()

runner = TestRunner(
    lambda: print('case 1'),
    lambda: print('case 2'),
    lambda: print(im_not_defined),
    lambda: print('case 4')
)
然后您只需调用
run
方法来运行测试:

>>> runner.run()
case 1
case 2
name 'im_not_defined' is not defined
>>> runner.run()  # resume from last failure; will fail again since we didn't fix it
name 'im_not_defined' is not defined
>>> runner.queue[0] = lambda: print('case 3 fixed')
>>> runner.run()
case 3 fixed
case 4

不确定这是否比您的上下文管理器方法更好,但它可能更简单,只运行一次
,而不是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

# python 3
class TestRunner:

    def __init__(self, *test_cases):
        self.queue = list(test_cases)

    def run(self):
        for i, case in enumerate(self.queue):
            try:
                run_test(case)
            except Exception as e:
                print(e)
                self.queue = self.queue[i:]
                break
为了演示的目的,让我们假设

def run_test(case):
    case()

runner = TestRunner(
    lambda: print('case 1'),
    lambda: print('case 2'),
    lambda: print(im_not_defined),
    lambda: print('case 4')
)
然后您只需调用
run
方法来运行测试:

>>> runner.run()
case 1
case 2
name 'im_not_defined' is not defined
>>> runner.run()  # resume from last failure; will fail again since we didn't fix it
name 'im_not_defined' is not defined
>>> runner.queue[0] = lambda: print('case 3 fixed')
>>> runner.run()
case 3 fixed
case 4

这可能是一份合作项目的工作吗?你考虑过这些吗?你不能只
产生
?你不能只使用一个片段吗<代码>对于测试中的案例\u案例[lastcase+1://code>从下一个案例开始?即使其中一个失败,也不可能继续运行其余的测试吗?我想,
试一下,除了你所需要的。既然你想从失败的测试中恢复,我认为没有依赖性问题。再加上@gill的观点:你可以返回失败测试的列表,并将它们传递给下一个test_foo调用。这是一个协同程序的作业吗?你考虑过这些吗?你不能只
产生
?你不能只使用一个片段吗<代码>对于测试中的案例\u案例[lastcase+1://code>从下一个案例开始?即使其中一个失败,也不可能继续运行其余的测试吗?我想,
试一下,除了你所需要的。既然你想从失败的测试中恢复,我认为没有依赖性问题。再加上@gill的观点:你可以返回失败测试的列表,并将它们传递给下一个test_foo调用。