Domanda

Il mio background è C e C ++. Mi piace molto Python, ma c'è un suo aspetto (e altri linguaggi interpretati immagino) con cui è davvero difficile lavorare quando sei abituato ai linguaggi compilati.

Quando ho scritto qualcosa in Python e sono arrivato al punto in cui posso eseguirlo, non c'è ancora alcuna garanzia che non rimangano errori specifici della lingua. Per me ciò significa che non posso fare affidamento esclusivamente sulla mia difesa di runtime (test rigorosi di input, asserzioni ecc.) Per evitare arresti anomali, perché in 6 mesi quando un codice altrimenti piacevole viene finalmente eseguito, potrebbe rompersi a causa di un errore di battitura stupido .

Chiaramente un sistema dovrebbe essere testato abbastanza per assicurarsi che tutto il codice sia stato eseguito, ma il più delle volte uso Python per script interni e piccoli strumenti, che ovviamente non ottengono mai l'attenzione sul QA di cui hanno bisogno. Inoltre, un po 'di codice è così semplice che (se il tuo background è C / C ++) sai che funzionerà bene fintanto che si compila (ad esempio metodi getter all'interno delle classi, di solito un semplice ritorno di una variabile membro).

Quindi, la mia domanda è ovvia: c'è un modo (con uno strumento speciale o qualcosa del genere) che posso assicurarmi che tutto il codice nel mio script Python " compili " ed eseguire?

È stato utile?

Soluzione

Guarda PyChecker e pylint .

Ecco un esempio di output di pylint, derivante dal banale programma:

print a

Come puoi vedere, rileva la variabile non definita, che py_compile non farà (deliberatamente).

in foo.py:

************* Module foo
C:  1: Black listed name "foo"
C:  1: Missing docstring
E:  1: Undefined variable 'a'


...

|error      |1      |1        |=          |

Esempio di prova del perché i test non sono abbastanza buoni, anche se coprono " ogni riga " ;:

bar = "Foo"
foo = "Bar"
def baz(X):
    return bar if X else fo0

print baz(input("True or False: "))

EDIT: PyChecker gestisce il ternario per me:

Processing ternary...
True or False: True
Foo

Warnings...

ternary.py:6: No global (fo0) found
ternary.py:8: Using input() is a security problem, consider using raw_input()

Altri suggerimenti

Altri hanno menzionato strumenti come PyLint che sono abbastanza buoni, ma il punto è che non è possibile fare il 100%. In effetti, potresti non voler nemmeno farlo. Parte del vantaggio della dinamica di Python è che puoi fare cose folli come inserire nomi nell'ambito locale attraverso un accesso al dizionario.

Ciò che si riduce è che se si desidera un modo per rilevare errori di tipo in fase di compilazione, non si deve usare Python. Una scelta linguistica comporta sempre una serie di compromessi. Se scegli Python su C, tieni presente che stai commerciando un sistema di tipo forte per uno sviluppo più veloce, una migliore manipolazione delle stringhe, ecc.

Penso che ciò che stai cercando sia la copertura della linea di test del codice. Vuoi aggiungere dei test al tuo script che assicurino che tutte le tue righe di codice, o quante ne hai tempo, vengano testate. Il test è una grande quantità di lavoro, ma se vuoi il tipo di garanzia che stai chiedendo, non c'è pranzo gratis, scusa :(.

Se stai usando Eclipse con Pydev come IDE, può contrassegnare molti errori di battitura per te con il rosso squigglies immediatamente, e ha anche l'integrazione di Pylint. Ad esempio:

foo = 5
print food

verrà contrassegnato come "Variabile non definita: cibo". Naturalmente questo non è sempre accurato (forse il cibo è stato definito in precedenza usando setattr o altre tecniche esotiche), ma funziona bene per la maggior parte del tempo.

In generale, puoi analizzare staticamente il tuo codice solo nella misura in cui il tuo codice è effettivamente statico; più dinamico è il tuo codice, più hai davvero bisogno di test automatizzati.

Il tuo codice viene effettivamente compilato quando lo esegui, il runtime di Python si lamenterà se c'è un errore di sintassi nel codice. Rispetto ai linguaggi compilati staticamente come C / C ++ o Java, non controlla se i nomi e i tipi di variabili sono corretti - per questo è necessario eseguire effettivamente il codice (ad es. Con test automatici).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top