Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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_Decorator_Yield - Fatal编程技术网

Python 一个鼻子测试用例上的装饰器

Python 一个鼻子测试用例上的装饰器,python,decorator,yield,Python,Decorator,Yield,我有下面的decorator,它应该将测试用例函数的实现包装在try/except块中,并在出现异常时打印日志 def print_log(test_case): @wraps(test_case) def run_test(self): try: test_case(self) except: Test_Loop.failure_teardown(self) raise

我有下面的decorator,它应该将测试用例函数的实现包装在try/except块中,并在出现异常时打印日志

def print_log(test_case):
    @wraps(test_case)
    def run_test(self):
        try:
            test_case(self)
        except:
            Test_Loop.failure_teardown(self)
            raise
   return run_test
然而,在我的一个调用收益率生成器的测试用例中,这似乎不起作用

请容忍我,因为这是一个基本的例子:

class Test_Loop:
    # ton of implementation here (e.g. initialization, etc)

    def runIt(self, name, ip, port):
        # code here

    @print_log
    def test_log_looper(self):
        for l in self.links:
            # initialize variables seen below and other stuff
            for n in names:
                # do stuff
                for i in ips:
                    # do stuff
                    for p in ports:
                        yield self.runIt, l, n, i, p

从调试来看,当应用装饰器时,它似乎甚至没有进入第一个循环。我做错了什么?

您需要迭代您的生成器。按如下方式修改装饰器:

def print_log(test_case):
    @wraps(test_case)
    def run_test(self):
        try:
            for _ in test_case(self): pass
        except:
            Test_Loop.failure_teardown(self)
            raise
   return run_test

1.实际上,您从未从包装器返回调用
test\u case
的结果。2.您实际上也不会在包装器中使用生成器。从
print\u log
调用
test\u case
只会返回生成器;你没有重复,谢谢。最后,我将for循环移到try块的外部,并在中调用
yield
,因为我希望每个迭代都被包装,但是现在它无法识别何时会发生异常。您确定需要将其移到try块的外部吗?如果您将其保存在try语句中,则每个迭代都将被包装到try语句中。是的,我希望生成器的每个迭代都被包装到try语句中,以便在任何一个抛出异常时,都会打印日志。然而,我无法得到这项工作相应。