На этот вопрос уже было много высоко оцененных ответов и принятый ответ, но все они до сих пор были отвлечены различными способами выражения логической проблемы и упустили важный момент:
У меня есть сценарий python, который может получать ноль или три аргумента командной строки. (Либо он работает по умолчанию, либо требует указания всех трех значений)
Эта логика не должна лежать в основе вашего кода , скорее, она должна обрабатыватьсяargparse
модулем. Не утруждайтесь написанием сложного оператора if, вместо этого лучше настроить парсер аргументов примерно так:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
И да, это должна быть опция, а не позиционный аргумент, потому что это, в конце концов, необязательно .
отредактировано: Чтобы решить проблему LarsH в комментариях, ниже приведен пример того, как вы могли бы написать это, если бы были уверены, что вам нужен интерфейс с 3 или 0 позиционными аргументами. Я считаю, что предыдущий интерфейс лучше по стилю, потому что необязательные аргументы должны быть параметрами , но вот альтернативный подход для полноты картины. Обратите внимание на переопределение kwargusage
при создании вашего парсера, потому что вargparse
противном случае автоматически сгенерирует вводящее в заблуждение сообщение об использовании!
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
Вот несколько примеров использования:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments