È considerata una buona pratica usare i mutabili in questo modo? [chiuso]

1

Ultimamente mi sono imbattuto in un modo di usare i mutabili che non avevo mai pensato prima.

Diciamo che hai una comprensione di lista che chiama un metodo e metti il risultato in una lista come la seguente (cose normali):

my_list = [my_object.do_stuff() for my_object in all_objects]

Il metodo do_stuff esegue alcuni calcoli del ciclo per creare cose diverse, è piuttosto complicato. Per ora va tutto bene, ma si scopre che devi fare ancora parte di quel calcolo, e mettere il risultato in un'altra lista, subito dopo:

my_other_list = [my_object.do_just_a_part_of_stuff() for my_object in all_objects]

Scopri che per evitare di eseguire lo stesso bit di calcolo due volte, puoi utilizzare un mutabile come set nel seguente modo:

my_set = set()
my_list = [my_object.do_stuff(my_set) for my_object in all_objects]
my_other_variable = do_something_with(my_set)

Come puoi vedere, my_set è vuoto all'inizio, passato come argomento a do_stuff che lo modifica in posizione quel tanto che basta mentre esegue i calcoli menzionati sopra, e poi una volta modificato, my_set viene usato per my_other_list .

Questo tipo di schema è comunemente considerato una buona pratica? E ha persino un nome? Devo dire che lo trovo abbastanza semplice ed elegante, ma mi sto anche chiedendo se non sia un po 'pericoloso e forse non così facile da leggere quando incontri per la prima volta il codice base.

    
posta Jivan 20.08.2015 - 21:34
fonte

2 risposte

2

Potrebbe essere peggio, ma è eccessivamente accoppiato e un segno il tuo do_stuff è troppo grande. Lo farei solo se avessi bisogno delle prestazioni extra, e non potrei pensare in nessun altro modo.

Non ci hai dato molto per andare avanti, ma di solito problemi del genere possono essere molto più chiaramente scomposti nel seguente modo:

common = [my_object.get_common() for my_object in all_objects]
my_list = list_from_common(common)
my_other_list = other_list_from_common(common)
    
risposta data 20.08.2015 - 22:43
fonte
1

Direi che la mutazione all'interno di una comprensione di lista sembra inaspettata e quindi può essere più incline agli errori. In una revisione del codice chiederei di riscriverlo utilizzando un ciclo esplicito tipico della mutazione.

Inoltre, non è necessario [element for element in my_set] per trasformare un set in un elenco, list(my_set) sufficiente. Puoi anche eseguire iterazioni su un set come faresti su un elenco o su qualsiasi altro iterabile.

    
risposta data 20.08.2015 - 22:25
fonte

Leggi altre domande sui tag