Modulo impostazioni Refactor su oggetto settings (python)

1

Ho una piccola applicazione python (circa 6000 loc), dove tengo le mie impostazioni in un file separato modulo, settings.py. Quando l'applicazione è cresciuta, ho iniziato ad aggiungere test. Ora dopo aver avuto sempre più test, e cercando di testare con impostazioni diverse, trovo che il modulo l'approccio non è stata una grande idea, in quanto non molto flessibile - devo sempre ragionare su dove e quando settings.py viene importato, in modo da eseguire le mie modifiche su posto giusto ecc.

Ora ho un nuovo approccio, che usa ancora settings.py, ma verrà importato solo una volta e trasformato in un oggetto di configurazione che posso passare e modificare localmente senza influenzare nient'altro. Ora potrei avere diverse versioni di settings.py, il costruttore di oggetti di configurazione accetta un nome file come argomento facoltativo. Quindi penso di essere meglio preparato per i miei test.

Ora viene il refactoring, e bevor mi immergo in esso, mi piacerebbe avere un secondo (o terzo;)) parere su come affrontare il refactoring. Ecco la mia idea:

  1. Tutte le funzioni e i metodi che utilizzano il modulo delle impostazioni ottengono un argomento di parole chiave per a modulo impostazioni (impostazioni = Nessuno).
  2. Decorare tutte queste funzioni con un decoratore che inietta l'oggetto delle impostazioni, se presente non dato dal chiamante originale. Inoltre, avvisare dell'iniezione, in modo che io ne sia consapevole di dove ho bisogno di modificare la chiamata.

A questo punto, dovrei ancora avere un codice funzionante e posso iniziare a cercare i chiamanti. Inoltre, i passaggi 1 e 2 potrebbero essere fatti da uno script, per ridurre il tedio. Una volta eliminati tutti gli avvisi correggendo le chiamate, posso rimuovere il decoratore.

In questo modo, nel mio modo di pensare, non ho mai uno stato se avessi bisogno di cambiare un sacco di cose contemporaneamente per avere un codice funzionante, quindi avere un buon viaggio.

Sembra un approccio ragionevole? O sto pensando troppo a questo? O perdere nessuno punti importanti?

    
posta Isaac 23.11.2016 - 10:40
fonte

1 risposta

1

Personalmente non farei nessuna delle due opzioni e ho solo ogni modulo / file per istanziare il tuo oggetto Config al momento dell'importazione.

Quindi nella maggior parte del tuo codice sostituirai:

Import config

Con:

from configuration import Config
config = Config()

Puoi quindi utilizzare l'oggetto esattamente nello stesso modo in cui hai fatto il modulo.

Questo ti porterà un oggetto Config separato senza dover modificare ogni funzione nella tua app, ti libera dalla configurazione globale e ti permette di applicare facilmente patch alla configurazione del tuo test senza influenzare la configurazione delle tue importazioni.

Sarà facile da fare e potrebbe essere così profondo come è necessario andare.

    
risposta data 08.12.2016 - 09:15
fonte

Leggi altre domande sui tag