|
Finora abbiamo fatto esempi utilizzando direttamente la riga di comando. In generale i programmi vengono mantenuti dentro dei file, e poi caricati da questi quando necessario. Come regola, un modulo corrisponde ad un file, generalmente con estensione ".py".
Per cui, se vogliamo mettere la nostra funzione fattoriale ("fact") in un file, scriveremo un file "fact.py", e lo porremo in una opportuna directory sul disco che sia conosciuta all'interprete (vedi dopo). A questo punto, possiamo accedere alla funzione definita come segue:
>>> import fact
Da questo momento le funzioni definite in quel file sono accessibili. Ma c'è una importante differenza rispetto a definire una funzione direttamente sulla riga di comando: occorre utilizzare questa sintassi per utilizzarla:
>>> fact.fact(6)
720
Notare quindi che bisogna usare, come prefisso, il nome del modulo importato. A volte questa necessità è scomoda. Ma in generale, dato che ci sono tanti moduli, che contengono tante funzioni, di fatto è una scomodità che aumenta la leggibilità dei programmi.
Comunque, non è obbligatorio utilizzare sempre e comunque, esplicitamente, come prefisso il modulo: in realtà si può benissimo importare solamente la funzione richiesta, utilizzandola quest'altra sintassi:
>>> from fact import fact
In questo modo è disponibile la funzione "fact" non "fact.fact".
In termini tecnici nel primo caso viene importato nello "spazio dei nomi" il modulo, e usato il modulo per accedere alle funzioni contenute. Nel secondo caso viene importato nello "spazio dei nomi" direttamente la funzione, estraendola dal modulo (che deve comunque essere caricato).
In certi casi è conveniente importare tutte le funzioni da un modulo, per di più rendendole immediatamente disponibili con il loro nome senza prefisso:
>>> from fact import *
In questo modo vengono importate tutte le funzioni (e anche tutte le classi) contenute nel file, che diventano direttamente accessibili con loro nome, e senza prefisso. Una importante eccezione alla importazione è che non vengono importate tutte le funzioni (e classi) il cui nome inizia con un carattere di sottolineatura ("_"). Non è comunque consigliabile, specialmente quando ci sono molte funzioni definite nel file. La possibilità di conflitto è alta, e il codice con questi nomi abbreviati risulta meno leggibile.
In generale Python non ha costrutti che limitano la visibilità (come per esempio in Java): il "non accesso a parti riservate" viene lasciato alla "buona educazione del programmatore". Comunque esistono delle convenzioni che, quanto meno, guidano programmatore a distinguere le parti riservate da quelle pubbliche.
La principale convenzione è appunto che in nomi che cominciano con "_" e "__" sono da considerare, rispettivamente, "riservati" o "molto riservati". A seconda dei casi, queste convenzioni vengono anche prese in considerazione da alcuni costrutti del linguaggio.
Per l'appunto, l'importazione esclude i nomi che cominciano con "_"; ma è sempre possibile accedere alle funzioni private chiamandola con il prefisso esplicito del modulo.
|