Потрібен будь-який з двох аргументів, використовуючи argparse


183

Подано:

import argparse

pa = argparse.ArgumentParser()
pa.add_argument('--foo')
pa.add_argument('--bar')

print pa.parse_args('--foo 1'.split())

Як мені

  • зробити по крайней мере один з «Foo, Bar» обов'язковим: --foo x, --bar yі --foo x --bar yвсе в порядку
  • зробити принаймні один із "foo, bar" обов'язковим: --foo xабо --bar yдобре, --foo x --bar yні

Відповіді:


297

Я думаю, ви шукаєте щось на зразок взаємного виключення (принаймні, для другої частини вашого запитання).

Таким чином, буде прийнято лише колонтитул або бар, а не обидва.

    import argparse

    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--foo',action=.....)
    group.add_argument('--bar',action=.....)
    args = parser.parse_args()

BTW, щойно знайшов ще одне питання, що стосується такого ж виду.

Сподіваюся, це допомагає


1
Я ніколи б не здогадався, що це так просто! Люблю тебе Python 3.6!
bjd2385

Хто Крістіан Віттс і де його відповідь?
ijoseph

3
Ей @ijoseph, ця відповідь на сьогодні вже давно стара. Я не впевнений, що відповідь вже був. Напевно, його вже видалено. Вибачте за це!
jlengrand

1
@jlengrand ваша відповідь все ж спрацювала для мене після того, як я зрозумів, що вона фактично вирішує обидві умови, запропоновані в питанні (в XORосновному). Моє первісне занепокоєння полягало в тому, що ваша вирішила лише одну з двох умов.
ійосеф

Дякуємо за відгук. Я мав ідею, що це все вирішує, але більше не був впевнений: D. Відповідь я відредагую відповідно!
jlengrand

39

Якщо вам потрібна перевірка, яка не передбачена модулем, ви завжди можете це зробити вручну:

pa = argparse.ArgumentParser()
...
args = pa.parse_args()

if args.foo is None and args.bar is None:
   pa.error("at least one of --foo and --bar required")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.