2009-08-23 73 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)