È questo uno schema: classi autonome

0

Avendo scoperto di recente python, ho tentato di scrivere un semplice logger. I dati vengono letti da un dispositivo, elaborati, visualizzati e archiviati su disco. Questi diversi compiti appartengono a moduli diversi, ovviamente.

Ciò che sembrava essere interessante al momento, era fornire un'interfaccia a riga di comando per ogni modulo, come spiegato qui: link

Il risultato è tat sebbene il programma nel suo complesso usi import x e usi le classi nei moduli, i moduli possono essere usati anche dalla riga di comando. Ad esempio, invocando hw_comm.py si aprirà il dispositivo predefinito con le opzioni predefinite e lo stream su stdout . Anche plot.py si aspetta modulo dati stdin e disegna un grafico.

Posso vedere un sacco di vantaggi in questo design, come

  • facile da eseguire il debug
  • facile da adattare per diversi casi d'uso
  • facile da testare
  • fornisce un valore immediato all'utente finale, molto prima che il progetto sia finito.

Ho letto solo alcune migliaia di righe di python ancora, ma non ho visto questo approccio (moduli sia come classi importabili che come script stand-alone) altrove. Perché dovrebbe essere? Il lavoro extra per supportare questo formato è troppo per un progetto aziendale? O forse, a differenza del mio piccolo progetto, i progetti di scala aziendale non possono facilmente supportare questo comportamento, con centinaia di moduli che fanno cose diverse solo per raggiungere insieme un obiettivo complesso?

    
posta Vorac 19.09.2014 - 11:15
fonte

3 risposte

2

I vantaggi di essere in grado di eseguire un modulo dalla riga di comando sono chiari, come si delinea.

Tuttavia, quali sono i vantaggi di questa funzionalità che si trova nel modulo stesso? Non è così chiaro. Si potrebbe facilmente ottenere la stessa cosa con un semplice script wrapper che ha chiamato il modulo. Questo non sarebbe più un lavoro da programmare e altrettanto comodo da usare.

E, a mio parere, è meglio separare logicamente il modulo dal codice che usa il modulo.

    
risposta data 19.09.2014 - 12:47
fonte
0

L'utilizzo di un blocco if __name__ == "__main__" per eseguire alcuni test rapidi non è insolito - puoi anche trovarlo nella libreria standard .

Tuttavia, se si intende distribuire il pacchetto come app da riga di comando, gli utenti generalmente si aspettano che ci sia un punto di accesso all'eseguibile. (Immagina quanto sarebbe difficile usare rm se, invece di aggiungere un flag -r alle directory recurse, dovresti digitare rmdir , un comando completamente diverso).

In Python-land generalmente otteniamo questo risultato usando un singolo script main che importa i moduli interni del pacchetto e chiama le diverse funzioni come richiesto.

    
risposta data 19.09.2014 - 14:50
fonte
0

Il motivo per cui non lo vedi più spesso è che avere un file può essere sia un modulo che uno script non funziona bene se non in casi semplici. La ragione principale è che quando un sistema diventa più complesso si finisce con più moduli, e ad un certo punto lo script __main__ verrà importato, e a quel punto si avranno due copie di quel modulo in memoria - una volta come sys.modules['__main__'] e una volta come sys.modules[actual_name] . A quel punto cominciano a verificarsi strani errori e se non sai cosa sta succedendo puoi perdere ore a capirlo.

    
risposta data 16.10.2014 - 17:50
fonte

Leggi altre domande sui tag