Si sta utilizzando os.environ per memorizzare il valore degli switch della riga di comando pythonic?

1

Scrivo regolarmente script CLI eseguibili con CLI 3 per eseguire la compilazione dei dati e alcune attività di manutenzione, e provare ad aderire a PEP 8 e la Guida di stile di Google Python quando lo fai. La guida di Google dice di evitare l'uso di variabili globali, mentre PEP 8 offre convenzioni di denominazione, ma in realtà non incoraggia o scoraggia l'uso di esse, quindi non le uso.

Tuttavia, ultimamente mi sono trovato a utilizzare un'opzione "verbose" / passare molto insieme a una funzione " printv " da utilizzare durante il debug. Di solito assomiglia a questo:

def printv(opts, msg, **kwargs):
    if opts.verbose: print(msg, **kwargs)

Come incredibilmente pigro come sono, mi piacerebbe farlo in modo che non debba passare l'argomento opts (che è un oggetto OptionParser ) a printv . Il metodo più semplice sarebbe usare una variabile globale, certo. Un altro pensiero che ho avuto sarebbe stato quello di impostare una variabile "VERBOSE" in os.environ , poiché l'interruttore è, concettualmente, apportando una modifica all'ambiente di esecuzione. Ovviamente è contro-intuitivo, ma è pitonico?

    
posta p0lar_bear 16.12.2013 - 16:31
fonte

2 risposte

2

IMHO il livello di visibilità in cui afferri le tue opzioni dovrebbe in genere corrispondere al livello di visibilità della tua funzione printv . Quindi, quando c'è una sola funzione globale printv visibile ovunque nel tuo programma, è ok avere anche l'opzione "verbose" visibile a livello globale. Se printv è invece un membro di classe (ad esempio, di una classe "Logger", vedi commento da DXM), l'opzione "verbose" dovrebbe essere un membro della stessa classe. Se è una funzione all'interno di un modulo - stessa regola. Questo mi sembra alquanto naturale, ma non credo che sia un idioma specifico per il pitone.

L'uso di una variabile d'ambiente è appropriato per controllare l'opzione "verbose" dall'esterno del programma, questo non ha senso se lo "stato verboso" viene solo attivato e disattivato all'interno del programma. Se ti serve (ad esempio, perché hai due o più programmi che devono essere controllati dalla stessa variabile d'ambiente VERBOSE), leggi l'ambiente una volta dopo l'avvio del programma e memorizza lo stato nella tua% internaglobalOpts.verbose variabile (per un utilizzo successivo, ad esempio, nella tua funzione printv ).

    
risposta data 16.12.2013 - 17:10
fonte
0

La memorizzazione dello stato del programma nell'ambiente è non Pythonic.

Guardando la sezione GPSG su Variabili globali si dice esplicitamente che una delle eccezioni include le opzioni predefinite per gli script; Direi che se la tua CLI è uno script a singolo file, il fatto che il tuo oggetto opts sia globale va bene.

    
risposta data 16.10.2014 - 10:21
fonte

Leggi altre domande sui tag