Domanda

C'è un modo per avere un argparse.ArgumentParser non sollevare un'eccezione dopo aver letto un'opzione sconosciuta, ma piuttosto mettere tutte le opzioni sconosciute con i valori in un dizionario, e quelli senza valore in una lista?

Ad esempio, dire che nessun argomento è stato definito nel parser per prog.py, e passisco due argomenti:

./prog.py --foo bar --baz
.

Vorrei quanto segue:

parsed = parser.parse_args()
vals = parsed.unknown_with_vals
novals = parsed.unknown_without_vals

print(vals)
#{'foo' : 'bar'}
print(novals)
#['baz']
.

può essere fatto?

È stato utile?

Soluzione

known, unknown_args = parser.parse_known_args(...)
.

AS @ben w notato nel commento Come parse unknown_args è a te ad e.g., con la seguente grammatica:

unknown_args = *(with_val / without_val) EOS
with_val = OPT 1*VALUE
without_val = OPT
OPT = <argument that starts with "--">
VALUE = <argument that doesn't start with "--">
.

o come regex:

(O V+ | O)* $
.

Nota: i valori orfani sono vietati in questo caso.

Esempio
d = {}
for arg in unknown_args:
    if arg.startswith('--'): # O
        opt = arg
        d[opt] = []
    else: # V
        d[opt].append(arg) #NOTE: produces NameError if an orphan encountered

with_vals = {k: v for k, v in d.items() if v}
without_vals = [k for k, v in d.items() if not v]
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top