Utilizzo di "variabili intermedie" per abbreviare le voci lunghe dict

0

A volte mi imbatto nella situazione in cui ho alcuni dati in un dict annidato con nomi di chiavi piuttosto lunghi (a volte inevitabili per un motivo o per un altro).

some_dict = {'not_too_short_key_one': {'second_lvl_key_one': 23,
                                       'one_more_second_lvl_key': 5},
             'not_too_short_key_two': {'second_lvl_key_two': 123,
                                       'one_more_second_lvl_key': 321}}

A volte devo passare alcuni elementi del dict in alcune funzioni più di una volta:

# option 1

do_something(some_dict['not_too_short_key_one']['second_lvl_key_one'])

do_something_more(some_dict['not_too_short_key_one']['second_lvl_key_one'],
                  some_dict['not_too_short_key_one']['second_lvl_key_two'])

do_yet_another_thing(some_dict['not_too_short_key_one']['second_lvl_key_one',
                     some_dict['not_too_short_key_one']['second_lvl_key_two',
                     some_dict['not_too_short_key_two']['second_lvl_key_one'])

do_yet_another_thing(some_dict['not_too_short_key_one']['second_lvl_key_one',
                     some_dict['not_too_short_key_one']['second_lvl_key_two',
                     some_dict['not_too_short_key_two']['second_lvl_key_one'])

Mi chiedo se l'introduzione di variabili con il solo scopo di abbreviare le voci di dettatura abbia senso in queste situazioni. Sarebbe incoraggiato il seguente? Da un lato, rende le chiamate di singole funzioni un po 'meno prolisse e possono ridurre in modo significativo la dimensione complessiva del codice. D'altra parte, ogni variabile introdotta potrebbe cambiare e rendere quindi più difficile per un'altra persona capire come funziona il programma. Inoltre aggiunge un altro livello di riferimento indiretto per un lettore.

# option 2

item_1 = some_dict['not_too_short_key_one']['second_lvl_key_one']
item_2 = some_dict['not_too_short_key_one']['second_lvl_key_two']
item_3 = some_dict['not_too_short_key_two']['second_lvl_key_two']

do_something(item_1)
do_something_more(item_1, item_2)
do_yet_another_thing(item_1, item_2, item_3)
do_yet_another_thing(item_1, item_2, item_3)

Esiste una sorta di consenso su come affrontare questo problema (ad esempio preferisci l'opzione 1 o l'opzione 2) o forse una sorta di convenzione di denominazione per "variabili di abbreviazione" che è generalmente concordata?

    
posta Simon Fromme 22.12.2016 - 10:36
fonte

2 risposte

3

Questa è assolutamente una buona cosa da fare. L'introduzione di variabili intermedie con nomi significativi riduce contemporaneamente il tempo di lettura e aggiunge documentazione implicita.

Se sei preoccupato che i valori cambino inavvertitamente, puoi creare il nuovo vars final (beh, non in Python, ma in linea di principio).

In pratica i vantaggi sono ancora più chiari che nel tuo esempio perché è così astratto. Scambiare qualcosa come

configurator['hkey_local_machine'][0]['interfaces']['IP4']

con

my_ip

è un gioco da ragazzi a mio avviso.

    
risposta data 22.12.2016 - 10:44
fonte
0

La domanda è: quale è più leggibile e più facile da capire / mantenere?

Il codice duplicato non è di per sé negativo e le tue preoccupazioni sull'introduzione delle variabili sono valide, perché aumentano il carico cognitivo durante la lettura del codice (ad esempio, devi tenere presente ciascuna di esse e prestare attenzione se cambiano)

Quindi su queste due opzioni preferirei la prima. Ma suggerirei un terzo:

Introduci funzioni anziché variabili

def item_1_from_dict(dict):
    return dict['not_to_short_key_one']['second_lvl_key_one']


do_something(item_1_from_dict(some_dict))

Ovviamente item_1_from_dict dovrebbe avere un nome significativo.

Vantaggi:

  • Il blocco di codice "fai qualcosa con il dict" diventa più sintetico
  • Nessuna variabile temporanea per tenere traccia di
  • = > Accoppiamento meno temporaneo, ogni linea funziona da sola
  • Non c'è bisogno di abbreviare i nomi, la lingua è ancora chiara ed esplicita
risposta data 22.12.2016 - 10:51
fonte

Leggi altre domande sui tag