У меня есть 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
распознавать, что декорированная функция вызывается с *
-формой аргументов? Постскриптум Какое официальное название подписи для вызова?