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.