На це запитання вже було багато висококваліфікованих відповідей та прийнятої відповіді, але всі вони поки що відволікалися різними способами висловити булеву проблему і пропустили вирішальний момент:
У мене є сценарій 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