2011-07-27 9 views
2

选择基于参数类型的函数我有一个正在采取的参数任意一组,然后选择正确的功能基础上,类型的参数来处理它们的功能。在python

我的当前方法是使用在所有的用于检查类型的参数的处理功能的装饰,然后通过所有的功能迭代直到一个接受这些参数。

一下这似乎有点哈克给我,作为一个相对较新的Python程序员,我在想,如果有一个更“Python化”的方法来这样做。

如此,目前,我有这样的事情:

def function_router(*args): 
    for func in functions: #functions is a list of functions 
     try: 
     return func(*args) 
     except TypeError: 
     pass 
    #probably raise an exception if no function works 

和各功能在“功能”将有一个这样的装饰:

def accepts(*types) : 
    def my_decorator(func): 
     def wrapped(*args, **kwargs): 
     for i in range(len(types)): 
      if not isinstance(args[i], types[i]): 
       raise TypeError('Type error, %s not instance of %s, it is %s' %(args[i],types[i], type(args[i]))) 
      return func(*args, **kwargs) 
     return wrapped 
    return my_decorator 

编辑:哦,天哪,我居然真的喜欢阅读所有的解决方案。我选择的答案是最有效的方法目前我在做什么,但我学到所有的答案的东西,所以谢谢大家的时间。

+1

你能给一些现实世界中,你是如何使用装饰的例子吗? – NPE

回答

4

也许正确的做法是使用关键字参数,而不是依赖参数的类型。这样一来,你就不必装饰的小功能,只需正确命名的参数。它也可以让你利用Python的鸭子打字。

+0

澄清问题: 你是说每个函数都用kwargs,所以如果我用一个不好的kwargs调用一个函数,它会抛出一个错误? (本质上,相同的逻辑,用装饰者完成?) –

+0

基本上,是的。使用'** kwargs'。 – nmichaels