2013-02-23 3 views
41

Quando si scrive un modulo python e le funzioni, ho alcune funzioni "pubbliche" che dovrebbero essere esposte agli estranei, ma alcune altre funzioni "private" che dovrebbero essere viste solo e usato localmente e internamente.Convenzione di codifica della funzione "privata" Python

Capisco in python non ci sono funzioni private assolute. Ma qual è lo stile migliore, più pulito o più utilizzato per distinguere le funzioni "pubbliche" e quelle "private"?

Ne elenco alcuni degli stili che conosco:

  1. uso __all__ in file di modulo per indicare le sue funzioni "pubbliche" (What's the python __all__ module level variable for?)
  2. uso sottolineare all'inizio del nome di funzioni "privati"

C'è qualche altra idea o convenzione che le persone usano?

Grazie mille!

risposta

67

Dalla documentazione del modulo Class di Python:

privati”variabili di istanza che non è possibile accedere se non da all'interno di un oggetto non esistono in Python. Tuttavia, esiste una convenzione seguita dalla maggior parte del codice Python: un nome preceduto da un carattere di sottolineatura (ad esempio _spam) deve essere considerato come una parte non pubblica dell'API (indipendentemente dal fatto che si tratti di una funzione, un metodo o un membro dati) . Dovrebbe essere considerato un dettaglio di implementazione e soggetto a modifiche senza preavviso.

Poiché esiste un caso d'uso valido per i membri di classe privata (vale a dire evitare scontri di nomi con nomi definiti da sottoclassi), esiste un supporto limitato per tale meccanismo, chiamato mangling del nome. Qualsiasi identificatore del formato __spam (almeno due trattini bassi di sottolineatura, al massimo un trattino basso finale) viene sostituito testualmente con _classname__spam, dove nomenclatura è il nome della classe corrente con il carattere di sottolineatura principale rimosso. Questo tipo di manipolazione viene eseguito indipendentemente dalla posizione sintattica dell'identificatore, purché si verifichi all'interno della definizione di una classe.

+1

Grazie! Quindi in genere le persone useranno solo un trattino basso per distinguere tra funzioni "pubbliche" e "private" nel modulo? – Kaifei

+9

Principalmente. Come dice la documentazione, è una convenzione, puoi ancora accedere alle funzioni come sono pubbliche, ma il modo "corretto" di fare le cose è fingere che non siano realmente lì. –

+0

Questa convenzione si applica a funzioni che non sono basate su classi? – radtek