根据参数类型选择Python中的函数

2 投票
2 回答
2076 浏览
提问于 2025-04-16 22:22

我有一个函数,它可以接收一组任意的参数,然后根据这些参数的类型选择合适的处理函数。

我现在的做法是给所有处理函数加一个装饰器,这个装饰器会检查参数的类型,然后遍历所有函数,直到找到一个能接受这些参数的函数。

不过我觉得这样有点不太优雅,作为一个相对新手的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

而“functions”中的每个函数都会有一个这样的装饰器:

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

补充:哇,我真的很喜欢阅读所有的解决方案。我选择的答案对我现在的工作最有效,但我从所有的答案中都学到了东西,非常感谢大家的时间。

2 个回答

2

听起来你是在试图描述多重方法(multimethods),而GvR提供了一种很不错的做法,使用了一个装饰器的方式。

4

也许正确的做法是使用关键字参数,而不是依赖于参数的类型。这样,你就不需要给小函数加装饰器,只要正确命名参数就可以了。这还可以让你充分利用Python的鸭子类型特性。

撰写回答