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?
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]
.
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