2013-04-27 57 views
2

我想参数化使用装饰器的函数。最后,我能够在经过大量命中和试验之后按预期运行。但是我仍然不满意,就好像它在工作,但似乎并不是正确的做法。使用装饰器进行数据驱动测试

请帮我改进这段代码。

这里是我的代码:

def WarmWelcome(fn): 
    def wrapped(DataProvider): 
     for name in DataProvider(): 
     print fn(name) + ":)" 
    return wrapped 

def DataProvider(): 
    names=["abc","xyz","def"] 
    for name in names: 
     yield name 

@WarmWelcome 
def hello(name): 
    return "hello " +name 

hello(DataProvider) 

下面是更新后的代码:

def WarmWelcome(DataProvider): 
    def real_decorator(fn): 
    def wrapped(): 
     for name in DataProvider(): 
     print fn(name) + ":)" 
    return wrapped 
    return real_decorator 

def DataProvider(): 
    names=["abc","xyz","def"] 
    for name in names: 
     yield name 
@WarmWelcome(DataProvider) 
def hello(name): 
    return "hello " +name 

hello() 
+0

对我来说很好。那究竟是什么问题? – Aya 2013-04-27 13:54:27

+0

根据我的理解,更好的方法是通过装饰器函数传递DataProvider。像这样的东西:@WarmWelcome(DataProvider()),但我不能让它以这种方式运行。 – 2013-04-27 14:07:22

+1

@ vishul9,参见[这个答案](http://stackoverflow.com/a/5929165/521590)关于如何实现一个装饰器的参数。 – gatto 2013-04-27 14:19:31

回答

1

也有可能提供的数据集权WarmWelcome装饰:

def WarmWelcome(*data_sets): 
    def _decorator(func): 
     def _func(): 
      for ds in data_sets: 
       func(*ds) 
     return _func 
    return _decorator 

@WarmWelcome(
    ("abc",), 
    ("xyz",), 
    ("def",), 
) 
def hello(name): 
    return "hello " +name 

原文:PHPUnit-like dataProvider implementation for Python unittest

+1

请注意,[只有链接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info)不鼓励,所以答案应该是搜索解决方案的终点(vs.而另一个引用的中途停留时间往往会随着时间推移而过时)。请考虑在此添加独立的摘要,并将链接保留为参考。 – kleopatra 2013-11-21 15:38:11

+0

我认为你需要把你的字符串放在1-tuples中,或者做一些其他的东西而不是解压它们作为包装函数的参数。正如所写的,如果你调用'hello()',你会得到一个错误,从解开字符串并用两个很多参数调用原始函数,例如:'hello('a','b','c')'。如果你调用'hello(“Bob”)'',你会得到一个关于'_func'的错误,它不会接受任何位置参数。通常装饰者不应该改变方法的调用签名! – Blckknght 2013-11-22 06:12:09

+0

你是对的元组。固定。 – renskiy 2013-11-22 06:52:23