Qual è più pitone: controllando l'esistenza e non essere None, o usando la verità e get () con dicts?

3

Sto caricando un file di configurazione. Sto considerando i seguenti modi per farlo. Versione 1:

config = json.load('myconfig.json')
config_elm = config.get('some_config_elm')
if config_elm is not None:
    # use config_elm

... vs versione 2:

config = json.load('myconfig.json')
if 'some_config_elm' in config and config['some_config_elm'] is not None:
    config_elm = config['some_config_elm']
    # use config_elm

I file json validi sono i seguenti.

Con data set su qualcosa:

{
    'a_config_elm': 13,
    'some_config_elm': [42, 43]
}

... impostato sulla lista vuota:

{
    'a_config_elm': 13,
    'some_config_elm': []
}

... senza dati:

{
    'a_config_elm': 13
}

... con dati cancellati:

{
    'a_config_elm': 13,
    'some_config_elm': null
}

I casi 2 e 3 dovrebbero fare lo stesso.

La versione 1 sembra essere più efficiente, ma la versione 2 sembra un po 'più chiara. Il problema con 1 è che una lista vuota non passerebbe l'istruzione if, ma forse dovrebbe. Qualche idea?

    
posta André Christoffer Andersen 24.05.2017 - 11:58
fonte

2 risposte

3

Suggerirei di avere una configurazione predefinita, con tutti i valori di configurazione richiesti nelle impostazioni predefinite e quando si carica un file di configurazione sovrascrivendo le impostazioni presenti in quel file.

Quindi non devi preoccuparti della possibilità di voci mancanti, saranno tutte lì anche se mancano dalla configurazione caricata.

Sospetto che strumenti come mercurial adottino un approccio di:

  1. Crea l'oggetto di configurazione predefinito
  2. Esegui l'override con qualsiasi impostazione del sito da quel file di configurazione
  3. Ulteriore sovrascrittura con qualsiasi impostazione specifica del repository dal repository corrente
  4. Ulteriore sostituzione con qualsiasi opzione della riga di comando fornita

Ovviamente con questo approccio qualsiasi strategia di salvataggio della configurazione deve includere un ambito di impostazione per qualsiasi cosa si sta salvando, ma vale la pena, dato che è possibile aggiungere una nuova impostazione di configurazione senza doversi preoccupare di aggiornare i file di configurazione esistenti, < em> (semplicemente non includeranno la nuova impostazione, quindi otterranno i valori predefiniti) .

Per implementare questo qualcosa come:

def LoadSettings(self, filepath):
    """ Add the settings from a current file to this configuration object """
    new_settings_dict = json.load()
    assert isinstance(new_settings_dict, dict), "Error: Config must be a dict"
    for k, v in new_settings_dict.items():
         if hasattr(self, k):
             self[k] = v
         else:
             print("Unknown Configuration Item", k)
    
risposta data 25.05.2017 - 07:11
fonte
0

Dato che le tue impostazioni sono impostate in dict e la tua configurazione arriva come dict , quello che di solito vuoi è fare un aggiornamento sulle impostazioni.

Update the dictionary with the key/value pairs from other, overwriting existing keys.

settings = {
    'a_config_elm': 13,
    'some_config_elm': [42, 43]
}

config = { 'a_config_elm': 14}
settings.update(config)

settings

{'a_config_elm': 14, 'some_config_elm': [42, 43]}

Questo dovrebbe adattarsi alle tue esigenze.

    
risposta data 25.05.2017 - 10:43
fonte

Leggi altre domande sui tag