我已经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
识别装饰函数是使用*
-form of arguments 调用的?PS这种呼叫签名的正式名称是什么?