2009-08-23 69 views
3

我在寫單元測試是需要雙方的*args**kwargs參數的函數。一個合理的用例在該函數中的*args argment後使用關鍵字參數,即形式如何從舊Python版本隱藏不兼容的代碼?

def f(a, *b, **c): 
    print a, b, c 

f(1, *(2, 3, 4), keyword=13) 

現在這僅became legal in Python 2.6的;在早期版本中,上面的行是語法錯誤,因此甚至不會編譯爲字節碼。

我的問題是:如何測試在新的Python版本所提供的功能,仍然有測試較舊版本的Python運行?

我應該指出該函數本身對早期的Python版本來說工作正常,它只是一些在Python 2.6之前是語法錯誤的調用。我所看到的用於檢查Python版本的各種方法對此不起作用,因爲它不會超過編譯階段。

我寧願不要有測試分成,如果在所有可能的多個文件。

+0

爲什麼不簡單地將代碼重新格式化爲2.6之前的版本? – 2009-08-23 11:18:44

+0

@美國洛特:我想我並沒有意識到,新的語法只是語法糖,它可以在不同的早期版本來完成。如果我知道這是可能的話,我就不會問這個問題(不是每個人都爲你:)聰明) – 2009-08-23 15:08:35

回答

11

我不認爲你應該測試的Python是否正常工作;相反,請專注於測試您自己的代碼。在這種情況下,完全有可能以適用於所有Python版本的方式編寫特定調用,即:

f(1, *(2,3,4), **{'keyword':13}) 
+0

謝謝,這解決了我的問題。我太專注於讓我寫的代碼工作,並沒有意識到新的調用方法在早期的Pythons中具有相同的功能。 – 2009-08-23 15:17:41

2

一種方法可能是使用eval()exec與Python的當前版本的測試一起。這將推遲編譯到運行時,在那裏你可以控制編譯是否真的發生。

+0

格雷格的eval()是真的嗎? – UnkwnTech 2009-08-23 07:04:48

+3

我會說使用'eval()'完全適用於可以在任何版本的Python上運行的單元測試代碼。 – 2009-08-23 07:05:54

1

爲什麼要使用這種語法?我的意思是,除了快捷方式,這個2.6功能並沒有帶來任何真正的優勢。

a = [2,3,4] 
a.insert(0, 1) 
kw = {'keyword'='test'} 
f(*a, **kw)