Che cos’è __init__.py? A che cosa serve? Se programmi in Python vorrai certamente capire che cos’è questo file: scopriamolo assieme in questo articolo!
“__init__.py” è ovviamente come suggerisce il nome stesso, un file Python e fin qui “grazie al ca…”: le sue utilità sono legate per lo più alla creazione di pacchetti in Python.
Se non sai che cos’è un pacchetto in Python, ti invito a scoprirlo nel mio articolo in cui ne parlo.
Se sai che cos’è un pacchetto, ma vuoi crearlo, allora ti conviene leggerlo ugualmente 😉
Ciao mi chiamo Lorenzo Neri e sono un informatico: realizzo contenuti per aiutare le persone a padroneggiare l’arte del nuovo millennio, ovvero l’informatica!
Qualsiasi pacchetto Python ha la necessità di avere al suo interno questo file dal nome parecchio tecnichese: di fatto senza “__init__.py” difficilmente potrai dargli vita.
In Python esistono due tipi di package: i package regolari ovvero “regular” e i package namespace.
Cerchiamo di capire in che cosa differiscono e qual è il ruolo di __init__.py al loro interno.
Che cos’è __init__.py nei regular packages
I regular packages sono i pacchetti tradizionali, ovvero quelli già presenti dalla versione Python 3.2 o precedenti.
Quello che succede quando importi uno di questi pacchetti, è che “__init__.py” viene eseguito automaticamente.
Non solo.
Gli oggetti definiti al suo interno, sono correlati ai nomi presenti nel namespace del pacchetto stesso.
Che significa tutto l’ambaradam che ho scritto prima?
Che il codice presente all’interno di questo file può contenere lo stesso esatto codice scritto nel pacchetto stesso, al contempo Python si occuperà di aggiungere degli attributi aggiuntivi (perdona il gioco di parole, ma a questo giro lo giuro: era necessario!) quando il modulo stesso viene importato.
Ti faccio un esempio terra-terra.
Ammettiamo che il tuo pacchetto abbia la seguente struttura:
pacchetto/
__init__.py
uno/
__init__.py
due/
__init__.py
tre/
__init__.py
Se importi in uno script “pacchetto.uno” il file “__init__.py” presente nella cartella principale del progetto, andrà a includere anche quello dentro la cartella “uno”, così come accadrà anche per gli altri due componenti che vedi nell’esempio, quando li importerai.
Chiarito questo, vediamo come funzionano i pacchetti namespace.
Il ruolo di __init__.py nei namespace packages
Un pacchetto di tipo namespace è diverso dal tipo visto prima, perché si compone di varie porzioni.
Le porzioni, sono un elemento che ti invito ad approfondire con click qui se lo desideri.
Detto in maniera poco tecnichese, le porzioni, sono una piccola parte che va a comporre i “sottopacchetti” del nostro pacchetto namespace.
Può trattarsi di file zip, di altri file che vengono installati nel tuo sistema operativo, o addirittura presi dalla rete quando esegui la import di questo tipo i pacchetti nel tuo script.
Di fatto i namespace package, non hanno una lista per il loro attributo “__path__”, necessario per raccogliere i sottopacchetti come avviene per quelli di tipo regular.
Questo cosa vuol dire?
Che il ruolo di “__init__.py” in questi pacchetti, si limita a livello globale.
A differenza di quanto visto per i pacchetti regular, qua non abbiamo un file “__init__.py” per ogni sottopacchetto presente nel pacchetto stesso.