Quando usare il nesting della funzione python?

2

Sto scrivendo un programma che crea il backup delle directory.

Quale dei seguenti approcci è migliore per l'organizzazione del codice?

Crea una classe separata per logica Backup e Zip -

class BackupUtil:
    def backup(self):
       None

class ZipUtil:
    def archive_dir(self):
       None

O usa la funzione nesting come questo -

class BackupUtil:
    def backup(self):
        def archive_dir():
            None 
        None
    
posta Kshitiz Sharma 18.03.2014 - 09:37
fonte

3 risposte

5

In generale, quando la funzione interna è piccola e vuoi chiarire che è utile solo per la funzione di chiusura. In alternativa, quando è necessario restituire una funzione. Quest'ultimo scenario è banale in quanto generalmente la funzione interiore si basa sulle variabili nell'ambito delle funzioni che la racchiudono, quindi dichiararlo altrove non è un'opzione. In questo caso potresti essere in grado di utilizzare un lambda, ma qualsiasi cosa più lunga di un'espressione richiederebbe una dichiarazione di funzione completa.

Senza le implementazioni è difficile dire quale scegliere in questo caso. Mi affretto ad aggiungere che non devi mettere tutto in una classe.

    
risposta data 18.03.2014 - 12:42
fonte
3

TL; DR: usa la funzione annidamento quando ti servono le caratteristiche del nesting di funzioni

Casi di utilizzo della nidificazione delle funzioni (idiomi per lo più funzionali, quasi certamente incompleti perché sono fuori di testa) :

  • chiusure
  • funzione factory (creazione di una funzione programmatica basata su parametri)
  • creazione di funzioni chiamando functool.partial
  • creazione di funzioni usando lambda
  • altri motivi per cui è necessario creare funzioni durante il tempo di chiamata

Trade-off:

    Le funzioni
  • sono strongmente accoppiate
  • viene sempre chiamato il codice (a meno che non si trovi in un blocco if)
  • complessità aggiuntiva del codice
  • costo di runtime aggiuntivo (potenzialmente, perché la funzione interna viene ridefinita con ogni chiamata alla funzione esterna)
  • molto più difficile da estendere
  • molto più difficile da introspezionare sulla definizione della funzione interna
risposta data 05.05.2014 - 09:46
fonte
0

Mantenere i due separati sarebbe utile per diversi motivi:

1) Avrai una maggiore flessibilità di lavoro con entrambe le classi (in particolare l'ereditarietà delle classi)

2) Puoi trasformare le due classi in moduli che puoi usare negli altri tuoi codici indipendentemente l'uno dall'altro

3) Eviterai di creare inutilmente una classe più grande quando forse hai solo bisogno di usare una delle due funzioni

4) Mantenere separate le funzioni aumenta anche la leggibilità del codice quando in seguito chiamate queste funzioni

Spero che questo aiuti a chiarire qualcosa.

    
risposta data 18.03.2014 - 12:07
fonte

Leggi altre domande sui tag