2010-10-12 15 views
31

Ho appena iniziato a imparare Python & ho trovato "namespace" concept in Python. Mentre ho preso il senso di ciò che è, ma non sono in grado di apprezzare la gravità di questo concetto.Cosa sono gli spazi dei nomi Python tutto

Alcuni navigatori in rete hanno rivelato che uno dei motivi contro PHP è che non ha supporto nativo per gli spazi dei nomi.

Qualcuno potrebbe spiegare come usare i namespace & come questa caratteristica rende la programmazione migliore (non solo in Python, come presumo spazi dei nomi in un concetto non limitata ad una determinata lingua).

Sono prevalentemente proveniente da ambienti di programmazione Java e C.

+2

Qualche altro ragazzo PHP ha avuto problemi con lo spazio dei nomi poche ore fa: http://stackoverflow.com/questions/3909002/ Potrebbe valere la pena leggere. Lo spazio dei nomi –

risposta

36

Lo spazio dei nomi è un modo per implementare l'ambito.

In Java (o C) il compilatore determina dove una variabile è visibile attraverso l'analisi dell'ambito statico.

  • In C, l'ambito è il corpo di una funzione o è globale o è esterno. Il compilatore lo spiega e risolve ogni nome di variabile in base alle regole di ambito. I nomi esterni vengono risolti dal linker dopo che tutti i moduli sono stati compilati.

  • In Java, scope è il corpo di una funzione di metodo o di tutti i metodi di una classe. Alcuni nomi di classi hanno anche un ambito a livello di modulo. Ancora una volta, il compilatore lo calcola al momento della compilazione e risolve ogni nome in base alle regole dell'ambito.

In Python, ogni pacchetto, modulo, classe, funzione e metodo possiede uno "spazio dei nomi" in cui vengono risolti i nomi delle variabili. Inoltre c'è uno spazio dei nomi globale che viene utilizzato se il nome non è nello spazio dei nomi locale.

Ogni nome di variabile viene controllato nel namespace locale (il corpo della funzione, il modulo, ecc.), Quindi controllato nello spazio dei nomi globale.

Le variabili vengono generalmente create solo in uno spazio dei nomi locale. Le istruzioni global e nonlocal possono creare variabili diverse dal namespace locale.

Quando una funzione, una funzione di metodo, un modulo o un pacchetto viene valutata (ovvero avvia l'esecuzione) viene creato uno spazio dei nomi. Pensalo come un "contesto di valutazione". Quando una funzione di funzione o metodo, ecc., Termina l'esecuzione, lo spazio dei nomi viene eliminato. Le variabili vengono eliminate. Anche gli oggetti possono essere lasciati cadere.

+1

è un modo per implementare la gestione dei nomi all'interno di un ambito, poiché un ambito fa più della gestione dei nomi. guarda la mia risposta – alinsoar

3

Per comprendere gli spazi dei nomi, è necessario avere una certa comprensione dei moduli in Python. Un modulo è semplicemente un file contenente codice Python. Questo codice può essere sotto forma di classi, funzioni o semplicemente un elenco di nomi Python. Ogni modulo ottiene i propri spazi dei nomi globali. Quindi non puoi avere due classi o due funzioni nello stesso modulo con lo stesso nome in cui condividono lo spazio dei nomi del modulo.

di riferimento: http://bytebaker.com/2008/07/30/python-namespaces/

5

namespace prevenire i conflitti tra classi, metodi e gli oggetti con lo stesso nome che potrebbe essere stato scritto da persone diverse.

Provenendo da uno sfondo Java, probabilmente avete familiarità con il modo in cui questo viene ottenuto utilizzando i pacchetti, ad es. potresti creare una classe movieyoda.DateUtils e posso creare una classe mikej.DateUtils e il pacchetto consente il codice usando le classi per distinguerle. (Python ha something very similar.)

Gli spazi dei nomi sono stati aggiunti a PHP in 5.3.0 ma nelle versioni precedenti (e in altre lingue che non forniscono spazi dei nomi) si dovrebbe prefissare i nomi della classe e del metodo con qualcosa per ridurre il rischio di uno scontro di nomi. per esempio. una funzione movieyoda_parse_file.

0

Se si realizza un grande programma con qualcun altro, è possibile scrivere la propria parte del programma come si desidera. Tutte le variabili nel file saranno private, non ci saranno collisioni. Quando si scrivono programmi PHP, è facile riscrivere per errore le variabili globali. In Python puoi importare altre variabili di moduli se vuoi, e saranno "globali" sul tuo modulo.

Si potrebbe pensare a un file di un oggetto in Python. Quando scrivi programmi PHP puoi ottenere lo stesso scrivendo classi con variabili d'istanza.

0

Completo la risposta di S.Lott.

Direi che lo spazio dei nomi è un modo per implementare la gestione dei nomi all'interno di un ambito, perché un ambito fa più della gestione dei nomi.

In C gli ambiti sono di 4 tipi: globale, funzione, blocco e parametri di funzione (prototipo). Ognuno di questi tipi può creare uno o più spazi dei nomi, a seconda delle esigenze. Ci sono 4 ns in C - tags per s/u/e - id per nomi di file, nomi di funzioni e nomi var - parametri all'interno del prototipo di funzione - membri e campi di bit all'interno di s/u.

In questo modo, identificatori di tag e nomi di funzioni non si scontrano, ma i nomi di tipo definiti da typedef possono scontrarsi con nomi di variabili.

In python c'è uno spazio dei nomi incorporato che racchiude il ns globale e il ns globale è fornito dal modulo caricato. I built-in contengono variabili. Un simbolo per una variabile può definire un oggetto o una funzione, ad esempio, + viene definito lì. Il numero globale del modulo dura fino alla fine.

Vedere anche that e, naturalmente, that.

Problemi correlati