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.