在解压缩的多个参数上进行一次调度

时间:2019-06-05 07:40:15

标签: python-3.x overloading generic-function single-dispatch

我有一个fancyfunction定义为对单个参数执行某些操作。我将其修饰为通用函数,以便它知道给定元组时该怎么做。

from functools import singledispatch

@singledispatch
def fancyfunction(arg):
    print(arg)

@fancyfunction.register
def _(arg: tuple):
    for a in arg:
        fancyfunction(a)

对于以上两个功能,有效的呼叫签名肯定是:

fancyfunction(foo)
fancyfunction((foo, bar, ...))

我想做什么

我想简化呼叫签名,以便不需要多余的一对括号:

fancyfunction(foo)
fancyfunction(foo, bar, baz, ...)

为此,我需要重载的函数来解压缩其位置参数:

@singledispatch
def fancyfunction(arg):
    print(arg)

@fancyfunction.register
def _(*arg):
    for a in arg:
        fancyfunction(a)

当然,上面的最后一个代码段不起作用。这样做:

fancyfunction(foo, bar, baz)

将调用通用函数而不是重载函数。

是否可以使singledispatch认识到装饰函数是用*形式的参数调用的?附言这种呼叫签名的正式名称是什么?

1 个答案:

答案 0 :(得分:1)

这有点令人困惑-您说您想“告诉”函数第一个参数为元组时该怎么做,但您不想传递元组(即您不想要方括号)。看来这是第三种情况-您想要传递元组,但又希望能够传递多个参数。

也许符合这些原则

from functools import singledispatch

@singledispatch
def fancyfunction(arg, *args):
    print(arg)
    for a in args:
        print(a)

@fancyfunction.register
def _(arg: tuple, *args):
    fancyfunction(*(*arg, *args))

另一种选择是具有帮助功能

from functools import singledispatch

def fancyfunction(*args):
    for a in args:
        helperfunction(a)

@singledispatch
def helperfunction(arg):
    print(arg)

@helperfunction.register
def _(arg: tuple):
    for a in arg:
        helperfunction(a)

在两种情况下都这样通话

fancyfunction(1)
fancyfunction(2, 3)
fancyfunction((4,5))
fancyfunction((6, 7) ,8, 9)
fancyfunction((10, 11), (12, 13))
fancyfunction([14, 15])

将产生以下输出

1
2
3
4
5
6
7
8
9
10
11
(12, 13)
[14, 15]
>>>