2013-09-01 12 views
7

Ho avuto una domanda su come funzionano le librerie come numpy. Quando imposto numpy, ho accesso a un host di classi, funzioni e costanti incorporate come numpy.array, numpy.sqrt ecc.Moduli Python con sottomoduli e funzioni

Ma all'interno di Numpy ci sono ulteriori sottomoduli come numpy.testing.

Come è fatto? Nella mia limitata esperienza, i moduli con i sottomoduli sono semplicemente cartelle con un file init .py, mentre i moduli con funzioni/classi sono veri e propri file python. Come si crea una "cartella" di moduli che ha anche funzioni/classi?

risposta

17

Una cartella con i file .py e uno è denominata package. Uno di quei file contenenti classi e funzioni è un module. L'annidamento delle cartelle può darti dei pacchetti secondari.

Così, per esempio se ho avuto la seguente struttura:

mypackage 
    __init__.py 
    module_a.py 
    module_b.py 
     mysubpackage 
      __init__.py 
      module_c.py 
      module_d.py 

ho potuto importare mypackage.module_a o mypackage.mysubpacakge.module_c e così via.

È inoltre possibile aggiungere funzioni a mypackage (come le funzioni di Numpy citate) inserendo tale codice nel numero __init__.py. Anche se questo di solito è considerato brutto.

Se guardi allo numpy's __init__.py, vedrai un sacco di codice lì dentro - molto di questo sta definendo queste classi e funzioni di alto livello. Il codice __init__.py è la prima cosa eseguita quando viene caricato il pacchetto.

+0

Quindi com'è possibile importare una libreria come numpy o scipy e contenere sia classi/funzioni (come un modulo) che altri moduli (come un pacchetto). Quindi posso eseguire numpy.array (una classe) o numpy.testing.assert ... (ottenere un modulo). – ImpGuard

+0

Ho appena risposto che è tutto nel '__init __. Py'. Qualsiasi funzione in questo sarà un membro di prima classe del pacchetto quando viene caricato dall'interprete. –

+0

Ah, questo è quello che mi stavo chiedendo. Ho pensato che sarebbe stato considerato brutto da un sacco di misc. la logica andrebbe in esso. Presumo che tutto sia stato codificato separatamente e in qualche modo tutto combinato in __init__.py dopo? Sembra abbastanza utile avere qualcosa del genere ma non sono sicuro di come replicarlo senza dover semplicemente scaricare un sacco di codice in un unico file. – ImpGuard

Problemi correlati