perché sono necessarie funzioni vuote

9

Ho iniziato a imparare Python e mi chiedo perché sono necessarie funzioni vuote in un linguaggio di programmazione

es. in python:

def empty_func():
    pass

anche negli script di shell sono disponibili funzioni vuote.

I miei Understanding e domande:

  1. Perché il linguaggio di programmazione aveva bisogno di funzioni vuote? E 'solo per giocare con il linguaggio di programmazione o nient'altro che conta davvero?

  2. Se questo ha uno scopo, qualcuno può descrivere il caso d'uso o fornire un esempio reale dell'uso di funzioni vuote?

  3. O esiste una tradizione di linguaggi di programmazione che consente funzioni vuote?


EDIT (le cose che ho ottenuto leggendo le tue risposte):

  • Per Sketch Algorithms o con funzioni astratte
  • Per l'invio di moduli senza alcuna azione deve essere eseguito
  • Segnaposto per alcune operazioni obbligatorie
posta jeyanthinath 13.01.2015 - 06:43
fonte

4 risposte

5

Nei linguaggi shell della famiglia Bourne, il comando : , che non fa assolutamente nulla, viene in genere utilizzato in due situazioni:

  • Segnaposto per quando qualcosa si aspetta un comando obbligatorio, ad es.

    while some_condtion
    do :
    done
    

    poiché do richiede almeno un comando.

  • Ignora gli argomenti, ma eseguendo effetti collaterali all'interno dell'elenco degli argomenti, ad es.

    : ${myvar=foo}
    

Sono sicuro che probabilmente ci saranno altre applicazioni che gli esperti di shell potrebbero sapere:)

In Python (e in altre lingue) è usato meno frequentemente. Può fungere da argomento per una funzione di ordine superiore quando in realtà non si vuole fare nulla. Ad esempio, supponiamo di avere una funzione che invia un modulo e consente di chiamare una funzione in modo asincrono dopo aver completato l'invio:

def submit(callback=empty_func):
    ...

In questo modo, se non viene fornito callback , l'invio continuerà ma non verranno eseguite ulteriori azioni. Se avevi usato None come valore predefinito, dovresti verificare esplicitamente se la callback era None , aggiungendo clutter al codice.

    
risposta data 13.01.2015 - 07:23
fonte
1

Dipende da dove ti trovi nel ciclo di sviluppo, ma a volte quando si disegna un algoritmo, si vuole fare astrazione su blocchi complessi senza implementarli subito.

def full_algo():
  init_stuff()
  process_stuff()
  ...

Sai come funziona init_stuff , è piuttosto semplice nella tua testa ma non ne hai davvero bisogno subito, quindi lo dichiari come una funzione vuota. Permetterà al tuo codice di compilare ed eseguire senza preoccuparsi dei dettagli cruenti.

Un altro uso per le applicazioni rilasciate è quando si utilizza l'ereditarietà. Supponiamo di avere una classe estesa che definisce il comportamento del codice specifico della piattaforma. Potresti finire con una logica simile a questa:

init_filesystem();
access_files();
release_filesystem();

Questo codice funzionerà su molte piattaforme, ma alcune piattaforme potrebbero non aver bisogno dell'inizializzazione del filesystem. Quindi la tua ereditarietà sarà simile a questa (virtuale con = 0 in C ++ significa semplicemente che le classi derivate DEVONO implementare questi metodi):

class FileSystem{
  virtual void init_filesystem() = 0;
  virtual void access_files() = 0;
  virtual void release_filesystem() = 0;
};

Quindi una particolare implementazione di questa classe (interfaccia) potrebbe non fare nulla per alcuni di questi metodi. In alternativa, la classe base potrebbe dichiarare metodi vuoti per init / release invece di dichiararli virtuali.

Finalmente (e vergognosamente), a volte si mantiene un'applicazione molto vecchia. Temete che l'eliminazione dei metodi possa rompere le cose. Questo accade quando si ha un'eredità complessa che non è propriamente compresa o quando si hanno molti indicatori di funzione (callback). Basta eliminare il codice all'interno di essi in modo che vengano chiamati comunque senza rompere nulla.

    
risposta data 13.01.2015 - 23:24
fonte
0

Rufflewind ha fatto un buon lavoro coprendo quando si poteva usare una funzione vuota in un programma completato. Nella mia esperienza, tende ad essere usato più spesso nei programmi incompleti, in modo da poter pianificare ciò che si sta per scrivere e farlo compilare finché non si è in grado di implementarlo. In altre parole, di solito è solo un segnaposto.

È necessario nel caso di Python perché usa il rientro per contrassegnare i blocchi, a differenza dei linguaggi di tipo C che usano le parentesi graffe {} . Questo significa che se non avevi pass , il parser non potrebbe dire se intendevi lasciarlo vuoto o se hai dimenticato. Includere pass rende il parser molto più semplice e ti offre una parola utile da cercare quando cerchi blocchi non implementati.

    
risposta data 13.01.2015 - 14:33
fonte
0

Anche se non è qualcosa che ti aspetti di fare in Python, ci sono delle volte nel mondo dei device driver dove devi fornire una funzione vuota, per gestire un evento che tu (a) non sai capita o (b) non importa nemmeno se lo fa.

Lo vedi anche in C con i callback. Occasionalmente, vedrai un codice che ASSUME solo che hai fornito un callback e prova a chiamarlo, ignorando il rischio di un puntatore nullo. Tutto quello che puoi fare in quel caso è fornire una routine di callback vuota. (Sì, ho in mente un particolare fornitore.)

    
risposta data 14.01.2015 - 00:50
fonte

Leggi altre domande sui tag