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

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


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")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.