Come faccio a gestire rapidamente i moduli Python

3

Scrivo codice Python per il calcolo scientifico. Come è la ricerca, mi trovo ad affrontare altri due problemi:

  1. le richieste cambiano rapidamente
  2. I risultati
  3. devono rimanere riproducibili

Immagina di avere un pacchetto A che è necessario in un vecchio progetto e poi di nuovo in uno nuovo. Il nuovo progetto richiede tuttavia alcune modifiche (questo non sarebbe un problema se si potesse mantenere la compatibilità all'indietro, ma ho sperimentato che ciò è praticamente impossibile in piccoli moduli molto specializzati). Le installazioni di sistema non consentirebbero di rieseguire il vecchio codice. Sono richieste installazioni separate.

Attualmente risolvo questo problema con i sottomoduli git: Il pacchetto A è sviluppato in un repository git e incluso come sottomodulo in entrambi i progetti. In questo modo, il codice dei progetti può sempre essere eseguito e gli aggiornamenti del pacchetto possono essere facilmente propagati.

Tuttavia, ho riscontrato un problema pratico con le importazioni python. La struttura delle cartelle di un pacchetto A sarebbe simile a questa:

A - A - mod.py
 |   |- __init__.py 
 |- B
 |- C

Dove B e C contengono pacchetti necessari per A e le cartelle vengono aggiunte al percorso python in init .py di A. Tuttavia, questo porta a un caso in cui un pacchetto è stato usato due volte e con diverse versioni:

A - A - mod.py
 |   |- __init__.py 
 |- B - B - mod2.py
 |   |   |- __init__.py
 |   |- C
 |- C

vale a dire. sia A sia B hanno portato la loro "propria" versione del pacchetto C. Quando B aggiunge C al percorso python, la cartella viene ignorata, perché viene semplicemente utilizzata la cartella, che è stata aggiunta da A. Questo può essere risolto specificando il percorso corretto quando si importa. Ma diventa un po 'brutto (vedi. link )

A causa di questo ho iniziato a chiedermi se questo è il modo giusto per ridurre la duplicazione del codice mentre si assicura un codice valido in un ambiente in rapida evoluzione. Vedi alternative / modi migliori?

    
posta Abschiedsstein 08.01.2016 - 18:24
fonte

1 risposta

1

Ecco un'opzione: puoi rinominare la nuova versione di un pacchetto e ripristinare il vecchio nome nei moduli in cui desideri utilizzare la nuova funzionalità.

Quando Python ha aggiornato il pacchetto Unittest nella libreria standard per Python 2.7, ha reso disponibile un backport per Python 2.6 chiamato unittest2 presente nell'Indice dei Pacchetti Python.

Per gli utenti di Python 2.6, che desiderano utilizzare la nuova funzionalità nel modulo più recente, verrà importato in questo modo:

import unittest2 as unittest

e le nuove funzionalità da 2.7 erano disponibili in 2.6 come se si stesse utilizzando 2.7. e le vecchie funzionalità continuavano a funzionare solo per esempio:

unittest.main()

Sei come l'utente di Python 2.6 che vuole utilizzare la versione più recente del pacchetto.

Quando aggiorni una dipendenza, puoi inserire un numero di versione sul nome del pacchetto (come hanno fatto con unittest2 ), e poi lo alias sull'importazione, fino a quando non hai tutto il codice non verificato e migrato all'utilizzo il nuovo modulo o sei abbastanza sicuro per aggiornare la dipendenza core, o (ugh) potresti farlo a tempo indeterminato. Spero che non lo farai a tempo indeterminato, nella mia mente, è solo uno stopgap.

    
risposta data 08.01.2016 - 20:12
fonte

Leggi altre domande sui tag