Richiede uno dei due argomenti usando argparse


183

Dato:

import argparse

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

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

come posso

  • fare almeno una delle "foo, bar" obbligatorio: --foo x, --bar ye --foo x --bar yvanno bene
  • rendere al massimo uno di "foo, bar" obbligatorio: --foo xo va --bar ybene, --foo x --bar ynon lo è

Risposte:


297

Penso che tu stia cercando qualcosa come l'esclusione reciproca (almeno per la seconda parte della tua domanda).

In questo modo, saranno accettati solo foo o bar, non entrambi.

    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()

A proposito, ho appena trovato un'altra domanda che si riferisce allo stesso tipo di problema.

Spero che questo ti aiuti


1
Non avrei mai immaginato che fosse così facile! Ti amo Python 3.6!
bjd2385

Chi è Christian Witts e dov'è la sua risposta?
ijoseph

3
Ehi @ijoseph, questa risposta è ormai vecchia. Non sono più sicuro di quale fosse la risposta. Ormai è stato probabilmente rimosso. Scusa per quello!
jlengrand,

1
@jlengrand la tua risposta ha funzionato ancora per me dopo che mi sono reso conto che risolve effettivamente entrambe le condizioni proposte nella domanda ( XOR, in sostanza). La mia preoccupazione iniziale era che la tua risolvesse solo una delle due condizioni.
ijoseph,

Grazie per il feedback. Avevo idea che stesse risolvendo tutto davvero, ma non ne ero più sicuro: D. Modificherò la risposta di conseguenza!
jlengrand,

39

Se hai bisogno di un controllo che non è fornito dal modulo puoi sempre farlo manualmente:

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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.