Stampa le istruzioni all'interno della funzione o prima di chiamarla? [chiuso]

2

Ho una sceneggiatura che persone diverse possono usare. Ho delle istruzioni per la stampa in modo che le persone possano seguire ciò che sta facendo lo script, e se si rompe dove è andato storto, e se un certo passo richiede molto tempo quale passo è stato.

In che modo per le dichiarazioni di stampa è meglio in questo caso e perché?

Questa:

def do_something():
    ...

print 'doing something'
do_something()

O questo:

def do_something():
    print 'doing something'
    ...

do_something()

Sono propenso a pensare che il primo sia migliore, in quanto è un po 'più chiaro ciò che accade quando le persone guardano il tuo copione; sanno che c'è una dichiarazione di stampa prima che la funzione venga chiamata, e puoi aggiungere dettagli extra quando a volte il nome della funzione non è così informativo come potrebbe essere.

Tuttavia vedo come potrebbe essere considerata la duplicazione del codice. E quindi il secondo è migliore.

Ma più importante di questa domanda abbastanza specifica è quale principio generale ti spingerebbe a preferire l'uno rispetto all'altro?

    
posta Will Beauchamp 07.11.2014 - 17:15
fonte

2 risposte

7

Nota: non utilizzare print per scopi di registrazione . L'utilizzo di print può funzionare per le piccole applicazioni, ma quando l'applicazione inizia ad aumentare, passare alla registrazione effettiva diventerebbe rapidamente inevitabile. Per evitare costi di manutenzione futuri, considera l'utilizzo della registrazione dall'inizio . Assicurati di utilizzare i quadri di registrazione predefiniti esistenti e non reinventare la ruota.

La parte di istruzione print della funzione? In altre parole, ha senso eseguire la funzione senza l'istruzione print ?

Se l'istruzione specifica è inerente alla funzione, inseriscila. Se l'istruzione specifica è inerente al contesto del chiamante, inseriscila lì.

Esempio:

def add_product(product):
    logger.debug("The product %s is about to be added to the database.", product.id)
    ...

Qui la registrazione è inerente alla funzione: non importa quando e dove è stata chiamata la funzione, quindi ogni volta che è, la voce di registro dovrebbe essere aggiunta.

def add_product(product):
    ...

logger.debug("Adding the product %s created by the administrator.", product.id)
add_product(self.newProduct)

Qui, d'altra parte, il contesto è importante: il messaggio di log indica il motivo per cui il prodotto viene aggiunto al database: viene aggiunto perché l'amministratore lo ha appena creato. Pertanto, il messaggio non ha senso all'interno della funzione.

    
risposta data 07.11.2014 - 18:21
fonte
2

Esistono modi migliori per consentire agli utenti di seguire le azioni degli script. Un modo è quello di restituire un oggetto che descriva quali passaggi sono accaduti, qual è il risultato e quanto hanno impiegato i passaggi. Se si interrompe, devi generare un'eccezione che includa informazioni aggiuntive.

Un altro modo per farlo è utilizzare le funzionalità AOP. Tuttavia, questi non sono integrati in python e si dispone di un piccolo supporto IDE quando si utilizza la riflessione / l'introspezione per ottenere il comportamento AOP desiderato. Il vantaggio è che il tuo codice di registrazione e il codice funzionale sono separati e la registrazione può essere abilitata e disabilitata o anche estesa senza dover toccare il codice funzionale.

Se non vuoi utilizzare nessuna di queste soluzioni, almeno fai in modo che i tuoi utenti siano in grado di iniettare un servizio utilizzato per la stampa, in modo che possano decidere cosa il servizio dovrebbe fare con i tuoi messaggi. È davvero brutto se si utilizza uno script di terze parti e lo script viene stampato su stdout o stderr. Quindi devi fare cose sporche di piping per prevenire output indesiderati.

    
risposta data 07.11.2014 - 18:19
fonte

Leggi altre domande sui tag