Membutuhkan salah satu dari dua argumen menggunakan argparse

183

Diberikan:

import argparse

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

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

bagaimana saya

  • membuat setidaknya satu dari "foo, bar" wajib: --foo x, --bar ydan --foo x --bar ybaik-baik saja
  • membuat paling banyak salah satu dari "foo, bar" wajib: --foo xatau --bar ybaik-baik saja, --foo x --bar ytidak
georg
sumber
1
kemungkinan duplikat dari Cara mengkode opsi kombinasional argparse dengan python
robert

Jawaban:

297

Saya pikir Anda sedang mencari sesuatu seperti pengecualian bersama (setidaknya untuk bagian kedua dari pertanyaan Anda).

Dengan cara ini, hanya foo atau bar yang akan diterima, bukan keduanya.

    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, baru saja menemukan pertanyaan lain yang merujuk pada jenis masalah yang sama.

Semoga ini membantu

jlengrand
sumber
1
Saya tidak pernah menduga itu begitu mudah! Aku mencintaimu Python 3.6!
bjd2385
Siapa Christian Witts dan di mana jawabannya?
ijoseph
3
HEy @ijoseph, jawaban ini sudah tua sekarang. Saya tidak yakin apa jawabannya lagi. Mungkin sudah dihapus sekarang. Maaf untuk itu!
jlengrand
1
@ jlengrand jawaban Anda masih bekerja untuk saya setelah saya menyadari itu sebenarnya memecahkan kedua kondisi yang diajukan dalam pertanyaan ( XOR, pada dasarnya). Kekhawatiran awal saya adalah bahwa Anda hanya menyelesaikan satu dari dua syarat.
ijoseph
Terima kasih untuk umpan baliknya. Saya punya ide itu memang menyelesaikan segalanya, tetapi tidak yakin lagi: D. Saya akan mengedit jawabannya!
jlengrand
39

Jika Anda memerlukan beberapa pemeriksaan yang tidak disediakan oleh modul, Anda selalu dapat melakukannya secara manual:

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")
sth
sumber