1

Итак, у меня есть некоторая функция, которая принимает список аргументов с минимальным одним аргументом, но потенциально полный список аргументов. Я знаю пару способов определения этого метода, но я пытаюсь определить, какие различные альтернативы мне доступны, и каковы различные преимущества каждого подхода.Указание списка аргументов с минимальным одним аргументом в списке

Я пытаюсь выяснить, какие возможные прототипы я могу использовать для определения этого аргумента. Я рассмотрел следующее:

def func(arg_1, *args): 
    arg_list = (arg_1,) + args 
    # do stuff with arg_list 

, а также

def func(*args): 
    if len(args) == 0: raise Exception("Not enough arguments specified") 
    # do stuff with args 

Существуют ли альтернативные способы указать функцию, которая принимает список аргументов с минимальным одним аргументом?

+1

Существует также 'assert len ​​(args)> 0', который выдает' AssertionError' – PEdroArthur

+0

А, да. Определенно другая жизнеспособная альтернатива. –

+3

'if not args' более идиоматичен, чем явно проверяя его длину. – chepner

ответ

1

В Python 3.5 вы можете (он присутствует с 3.0 я считаю, когда PEP 3102 вышел), но с ограничениями, которые дополнительные аргументы определяются без значения по умолчаниюипоставляется в ключевое слово при вызове определенной функции.

Это делается путем добавления * в качестве разделителя и требуемого аргумента (ов) после него:

def foo(*, must_specify, **kwargs): pass 

Вызов foo() без подачи ключевого слова аргумент формы must_specify = 'specified' приведет к TypeError намекая требование для этого конкретного аргумента:

foo() 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-45-624891b0d01a> in <module>() 
----> 1 foo() 

TypeError: foo() missing 1 required keyword-only argument: 'must_specify' 

позиционные аргументы сами по себе могут быть поставлены, но, позиционное параметр группирования формы *args не может т.е.:

def foo(pos_arg, *, must_specify, **kwargs): pass 

это хорошо, но:

def foo(pos_arg, *args, *, must_specify, **kwargs): pass 

является SyntaxError. Это делается потому, что * по существу такой же, как форма «отбрасывания» *args.

В любом случае, нет другого синтаксиса способ (что я знаю), который может удовлетворить ограничение, которое вы желаете. Если вы работаете с kwargs, это слишком много хлопот для вас или если вы работаете с Py2 и непреклонны для переключения, решения, рекомендованные в комментариях, являются вашим лучшим выбором.

Смежные вопросы