Argparse kullanarak iki bağımsız değişkenten birini gerektirme


183

Verilen:

import argparse

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

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

nasıl yapabilirim

  • "foo bar" nin az birinde yapmak zorunlu: --foo x, --bar yve --foo x --bar ygayet
  • "foo, bar" dan en fazla birini zorunlu kılmak: --foo xveya --bar yiyidir, iyi --foo x --bar ydeğildir

Yanıtlar:


297

Bence karşılıklı dışlama gibi bir şey arıyorsunuz (en azından sorunuzun ikinci kısmı için).

Bu şekilde, sadece foo veya bar kabul edilir, her ikisi de kabul edilmez.

    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, aynı konuya değinen başka bir soru daha buldu .

Bu yardımcı olur umarım


1
Asla bu kadar kolay olduğunu tahmin ederdim! Seni seviyorum Python 3.6!
bjd2385

Christian Witts kim ve cevabı nerede?
ijoseph

3
HEI @ijoseph, bu cevap şimdiye kadar eski. Cevabın artık ne olduğundan emin değilim. Muhtemelen şimdiye kadar kaldırılmıştır. Bunun için özür dilerim!
jlengrand

1
@jlengrand ve soruda önerilen her iki koşulu da (aslında) çözdüğünü fark ettikten sonra hala cevabım benim için çalıştı XOR. İlk kaygım, sizin iki koşuldan sadece birini çözmüş olmanızdı.
ijoseph

Geri dönüşünüz için teşekkür ederiz. Gerçekten her şeyi çözeceğine dair bir fikrim vardı, ama artık emin değildim: D. Cevabı buna göre düzenleyeceğim!
jlengrand

39

Modül tarafından sağlanmayan bir kontrole ihtiyacınız varsa, bunu her zaman manuel olarak yapabilirsiniz:

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.