我有一个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
认识到装饰函数是用*
形式的参数调用的?附言这种呼叫签名的正式名称是什么?
答案 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]
>>>