Насчёт входных параметров:
code python
def myfunc(a, b, c=5, *args, **kwargs):
print (a, b, c, args, kwargs)
*<название кортежа> - это неименованные параметры, **<название словаря> - именованные.
code python
# с - значение по умолчанию, "лишних" нет
>>> myfunc(1, 2)
(1, 2, 5, (), {})
# с - значение по умолчанию, d - "лишнее"
>>> myfunc(1, 2, d=3)
(1, 2, 5, (), {'d': 3})
>>> myfunc(1, 2, d=3, *(2,4))
(1, 2, 2, (4,), {'d': 3})
>>> myfunc(1, 2, 3, 4, 5, 6, d=7, e=8, f=9)
(1, 2, 3, (4, 5, 6), {'e': 8, 'd': 7, 'f': 9})
# аналогично предыдущему
>>> myfunc(*(1, 2, 3, 4, 5, 6), **{'d': 7, 'e': 8, 'f': 9})
(1, 2, 3, (4, 5, 6), {'e': 8, 'd': 7, 'f': 9})
# можно комбинировать
>>> myfunc(1, 2, 3, 4, x=10, y=11, *(5, 6), **{'d': 7, 'e': 8, 'f': 9})
(1, 2, 3, (4, 5, 6), {'y': 11, 'x': 10, 'e': 8, 'd': 7, 'f': 9})
Использование в повседневной жизни на каждом шагу, особенно **kwargs. Вот пример из рабочего проекта, можно сказать функция-прокси:
code python
@login_required
@user_in_groups('Modellers')
def modeller_bundles(request, **kwargs):
""" Show paginated list of bundles.
"""
kwargs['template_name'] = 'modeller_bundles.html'
kwargs['queryset'] = sort_query(Bundle.objects.filter(modeller=request.user.username), request)
kwargs['extra_context'] = {'sorts': request.GET.getlist('sort')}
kwargs['paginate_by'] = settings.PAGINATE_BY
kwargs['template_object_name'] = 'bundle'
return object_list(request, **kwargs)
Но и *args не остаётся незамеченным
code python
def sort_query(base_query, request):
""" Order base_query by parameters from request.GET['sort'].
"""
if 'sort' in request.GET and request.GET['sort']:
return base_query.order_by(*tuple(request.GET.getlist('sort')))
return base_query