Viaggi       https://it.bhlyqj.com

L'Istruzione `import` di Python: Moduli, Namespace e Best Practice

In Python, import è come porti codice da un modulo in un altro. Non è "main import" — quello non è un termine Python. Ecco come funziona davvero, con i pattern che userai quotidianamente.

Sintassi Import Base

import nome_modulo

Questo carica nome_modulo e lo lega a una variabile nel tuo namespace corrente. Accedi ai suoi contenuti con notazione punto:


import math
math.sqrt(16) # 4.0
math.pi # 3.14159...

Pattern Import Comuni

1. Importa Modulo (Default Raccomandato)


import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [1,2,3]})
arr = np.array([1,2,3])

Vantaggi: Esplicito, leggibile, evita conflitti nomi, mostra origine.

2. Importa Nomi Specifici


from math import sqrt, pi
sqrt(16) # 4.0 — niente prefisso necessario
pi # 3.14159...

Usa quando: Usi pochi nomi pesantemente. Evita: from modulo import * (inquinamento namespace).

3. Importa con Alias


import matplotlib.pyplot as plt
import seaborn as sns

Convenzioni standard (pd, np, plt, sns, tf, torch) rendono codice immediatamente leggibile.

4. Import Condizionali / Lazy


# Importa dipendenze pesanti solo quando serve
def analizza_dati():
    import pandas as pd # Import locale — avvio più veloce se inusato
    return pd.read_csv('dati.csv')

Come Funziona Import Sotto il Cofano

  1. Controlla sys.modules — se già caricato, restituisce modulo in cache
  2. Trova modulo via sys.path (dir corrente, PYTHONPATH, site-packages, stdlib)
  3. Esegue codice modulo — esegue statement top-level (def, class, assegnamenti)
  4. Crea oggetto modulo — namespace per globali del modulo
  5. Cache in sys.modules
  6. Leva nome nel namespace dell'importatore (per statement import)

Percorso Ricerca Moduli (sys.path)


import sys
sys.path # ['', '/usr/lib/python3.11', '/usr/lib/python3.11/lib-dynload',
# '/home/user/.local/lib/python3.11/site-packages', ...]
  • '' = directory script corrente (o CWD se interattivo)
  • Installa pacchetti: pip install pacchetto → site-packages
  • Virtual env isolano site-packages

Pacchetti e Sottomoduli


import pacchetto.sottomodulo
from pacchetto import sottomodulo
from pacchetto.sottomodulo import funzione

Directory con __init__.py = pacchetto. __init__.py può esporre sottomoduli:


# pacchetto/__init__.py
from .sottomodulo import funzione_pubblica
__all__ = ['funzione_pubblica']

Pitfall Comuni e Soluzioni

ProblemaCausaSoluzione
ModuleNotFoundErrorNon installato / env sbagliato / typopip install, controlla venv, controlla spelling
ImportError: cannot import nameImport circolare / nome non in moduloRistruttura, sposta import dentro funzioni
Conflitto nomifrom x import * o file locale nasconde stdlibNon nominare file math.py, random.py; usa import espliciti
Errore import relativoEsecuzione modulo come scriptEsegui come python -m pacchetto.modulo o usa import assoluti

Best Practice

  1. Libreria standard prima, poi terze parti, poi locali — ogni gruppo alfabeticamente
  2. Un import per riga (PEP 8)
  3. Usa import modulo su from modulo import *
  4. Alias: Usa standard community (pd, np, plt, tf, torch)
  5. Evita manipolazione path runtime — usa packaging corretto (pyproject.toml, pip install -e .)
  6. Type checking: from __future__ import annotations + guardie TYPE_CHECKING

Esempio: Blocco Import Pulito


# Libreria standard
import json
import os
from pathlib import Path
from typing import List, Optional
# Terze parti
import numpy as np
import pandas as pd
import requests
# Locali
from myproject.config import settings
from myproject.models import User
from myproject.utils import logger

Il sistema import di Python è potente, esplicito, prevedibile — una volta capito il modello namespace. La regola d'oro: rendi ovvio da dove viene ogni nome. Il tuo te futuro (e i colleghi) ti ringrazieranno.