Strutturazione di un progetto Python: serve una guida

3

Attualmente sto lavorando a un progetto che coinvolge diversi componenti discreti che hanno alcune funzionalità comuni e ho bisogno di qualche consiglio.

Al momento ho un componente centrale responsabile della distribuzione delle richieste a diversi componenti che traducono le richieste in particolari formati per particolari fonti di dati. I componenti sono in esecuzione come applicazioni Web separate dietro un server Nginx. La comunicazione tra tutti i componenti avviene tramite REST.

Un problema che sto incontrando è il fatto che molti componenti devono eseguire attività simili, che richiedono la duplicazione del codice, che voglio evitare.

Ad esempio, i componenti specifici dell'origine dati utilizzano le credenziali per l'autenticazione alle rispettive origini dati, ma il componente centrale ha anche bisogno di accedere a questo negozio per aggiungere nuove credenziali e aggiornare quelle esistenti (le credenziali sono memorizzate in un database comune).

In questo momento ogni componente è il proprio progetto / app, nella propria cartella separata.

Se si trattasse di un progetto Java, estrarre immediatamente la funzionalità comune, creare un JAR di libreria e far riferimento a tutti i componenti.

Tuttavia, non sono abbastanza sicuro di come farlo in Python. Non riesco davvero a combinare i componenti in un'unità monolitica perché ho bisogno della flessibilità per aggiungere nuovi componenti per nuove origini dati (a meno che qualcuno non conosca un modo semplice per gestirli). Inoltre, alla fine voglio componenti ridondanti per gestire carichi pesanti.

In primo luogo, dovrei eliminare le funzionalità comuni e inserirle nel proprio progetto / libreria? Ne vale la pena? Se è così, come si fa di solito in Python (sto usando la versione 2.7)?

Devo creare un oggetto distribuibile, (usando pip per esempio) oppure esiste un modo per definire una libreria comune senza passare attraverso questo problema?

    
posta Chris Chambers 28.07.2015 - 23:11
fonte

1 risposta

2

In Python, abbiamo pacchetti e moduli. Un modulo è "solo" un file .py , e un pacchetto è "solo" una directory con un file __init__.py (che è spesso vuoto). Puoi importare qualsiasi pacchetto o modulo che si trova in una directory elencata in sys.path , moduli all'interno di tale pacchetto, sotto-pacchetti all'interno di tale pacchetto, moduli all'interno di tali sotto-pacchetti, e così via.

Mentre puoi mettere la libreria in una delle directory standard del pacchetto di sistema, questo è spesso più un problema che non ne vale la pena, dal momento che la libreria sarà disponibile a livello di sistema. Puoi anche inserire il pacchetto direttamente nella directory del progetto, ma questo è un po 'fragile a seconda di come verrà lanciata la tua app. In tali circostanze, utilizziamo comunemente lo strumento Virtualenv . Ciò consente a ciascuna app di avere una propria directory di pacchetti separata.

Si noti che il sistema di importazione è stato revisionato in Python 3, come descritto in PEP 328 , e ora è un po 'più consistentemente comportato. Gli utenti Python 2 possono ottenere il nuovo comportamento con questo:

from __future__ import absolute_import
    
risposta data 29.07.2015 - 16:28
fonte

Leggi altre domande sui tag