2010-04-07 3 views
7

Utilizzando python optparse.py, c'è un modo per capire se è stato impostato un valore di opzione specifico dalla riga di comando o dal valore predefinito.Come sapere se l'opzione optparse è stata passata nella riga di comando o come predefinita

Idealmente mi piacerebbe avere un dict proprio come default, ma che contiene le opzioni in realtà fornito da linea di comando

So che si potrebbe paragonare il valore per ogni opzione con valori di default, ma questo non sarebbe distinguere un il valore è stato passato attraverso la riga di comando che corrisponde al valore predefinito.

Grazie!


EDIT

dispiace il mio fraseggio originale non era molto chiaro.

Ho un numero elevato di script chiamati dai file batch. A scopo di controllo, vorrei segnalare le opzioni che vengono passate e se sono passati da riga di comando, predefinito, o altri mezzi, a un file di registro.

Utilizzando i valori predefiniti è possibile stabilire se un'opzione corrisponde a un valore predefinito, ma ciò non indica ancora se è stato effettivamente fornito dalla riga di comando. Questo può essere rilevante: se un'opzione viene passata dalla riga di comando e concorda con l'impostazione predefinita, se si modifica il valore predefinito nel codice, lo script otterrà comunque lo stesso valore.

Per me sarebbe del tutto naturale avere un equivalente ai valori predefiniti, contenente i valori effettivamente forniti.

Per rendere il calcestruzzo domanda, in questo esempio:

>>> sys.argv = ['myscript.py','-a','xxx'] 
>>> import optparse 
>>> parser = optparse.OptionParser() 
>>> parser.add_option('-a', default = 'xxx') 
>>> parser.add_option('-b', default = 'yyy') 

Come faccio a sapere che l'opzione è stata approvata una da linea di comando. È l'unico modo per analizzare manualmente la riga di comando?

(so che questo è un punto abbastanza minore, ma ho pensato che sarebbe valsa la pena chiedere nel caso in cui mi manca smthing su optparse)

Grazie ancora

+2

Ma non è il punto di default che ti impedisce di preoccuparti di quali opzioni sono state passate, indipendentemente dal fatto che corrispondano o meno ai valori predefiniti? –

+0

Forse questo significa che hai bisogno di un'altra opzione? – codeape

+0

per favore vedi la mia modifica, si tratta di auditing, quindi fa la differenza come è stato chiamato lo script. – user265454

risposta

3

Non sul fatto che il codice è impossibile dare la risposta migliore, ma ...

  1. semplicemente non passano il default è il parser e verificare la presenza di valori None. Un valore None è un valore predefinito per lib optparse in modo da poter recuperare il proprio valore predefinito e agire come di consueto;

  2. estendere optparse per specializzarlo.

Non conosco il programma, ma in genere non è un buon comportamento di modifica del progetto quando la configurazione è la stessa.

6

Invece del codice standard di seguito:

opts, args = parser.parse_args() 

se si utilizza il codice qui sotto, si avrà un valori aggiuntivi oggetto opts_no_defaults con le opzioni che sono state esplicitamente specificato dall'utente:

opts_no_defaults = optparse.Values() 
__, args = parser.parse_args(values=opts_no_defaults) 
opts = Values(parser.get_default_values().__dict__) 
opts._update_careful(opts_no_defaults.__dict__) 

Alla fine, opts dovrebbe essere identico a quello del codice boilerplate iniziale.

print opts_no_defaults.__dict__ 
print opts.__dict__ 
for opt in parser._get_all_options(): 
    if opt.dest: 
     print "Value of %s: %s" % (opt._long_opts[0], getattr(opts, opt.dest)) 
     print "Is %s specified by user? %s" % (opt._long_opts[0], hasattr(opt_no_defaults, opt.dest)) 
+0

Davvero bello! Stavo pensando di creare un custom 'OptionParser.get_default_values ​​()' che ha restituito un valore personalizzato 'Values' per tenere traccia di se il valore ha un valore predefinito o meno. – haridsv

1
def is_opt_provided (parser, dest): 
    if any (opt.dest == dest and (opt._long_opts[0] in sys.argv[1:] or opt._short_opts[0] in sys.argv[1:]) for opt in parser._get_all_options()): 
     return True 
    return False  

Usage:

parser = OptionsParser() 
parser.add_option('-o', '--opt', dest='opt_var', ...) 

if is_opt_provided(parser, 'opt_var'): 
    print "Option -o or --opt has been provided" 

Sarebbe bello se i manutentori di Python inclusi la funzione suggerito alla classe OptionParser.

+0

Questo è altamente inaffidabile in quanto restituisce false + ve anche se la stringa di opzioni corrisponde a qualcosa in argomenti. – haridsv