2013-04-27 106 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

相關問題