Frage

Mein Hintergrund ist C und C ++. Ich mag Python viel, aber es ist ein Aspekt davon (und andere interpretierten Sprachen glaube ich), die wirklich schwer zu handhaben ist, wenn Sie zu kompilierten Sprachen gewohnt sind.

Wenn ich etwas in Python geschrieben habe und kommen zu dem Punkt, wo ich es laufen kann, gibt es noch keine Garantie, dass keine sprachspezifische Fehler bleiben. Für mich bedeutet, dass ich nicht allein auf meiner Laufzeit Verteidigung (rigorose Prüfung der Eingabe, der behauptet, etc.) verlassen kann Abstürze zu vermeiden, da in 6 Monaten, wenn einiger sonst schön Code schließlich ausgefuehrt wird, könnte es aufgrund einiger dummen Tippfehler knacken .

Offensichtlich sollte ein System getestet genug werden, um alle Code, um sicherzustellen, laufen, wurde aber die meiste Zeit verwende ich Python für in-house-Skripte und kleine Werkzeuge, die natürlich nie die QA Aufmerksamkeit bekommt sie brauchen. Außerdem ist ein Code so einfach, dass (wenn Ihr Hintergrund C / C ++ ist) Sie wissen, dass es funktioniert gut, solange es kompiliert (z Getter-Methoden innerhalb von Klassen, in der Regel eine einfache Rückkehr einer Membervariable).

Also, meine Frage ist die Offensichtliche - ist es eine Möglichkeit, (mit einem Spezialwerkzeug oder etwas) Ich kann den Code in meinem Python-Skript sicherstellen wird „kompilieren“ und führt

War es hilfreich?

Lösung

Lesen Sie PyChecker und PyLint .

Hier ist Beispiel für die Ausgabe von Pylint, aus dem trivialen Programm resultierende:

print a

Wie man sehen kann, erkennt er die undefinierte Variable, die py_compile wird nicht (absichtlich).

in foo.py:

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


...

|error      |1      |1        |=          |

Trivial Beispiel dafür, warum Tests nicht gut genug ist, auch wenn sie „jede Zeile“ abdecken:

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

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

EDIT: PyChecker nimmt die ternären für mich:

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()

Andere Tipps

Andere haben Tools wie PyLint genannt, die sind ziemlich gut, aber die lange und die kurze davon ist, dass es einfach nicht möglich ist 100% zu tun. In der Tat könnte man nicht einmal will, es zu tun. Ein Teil des Nutzen für Python dynamicity ist, dass Sie verrückt Dinge wie Insertnamen in dem lokalen Bereich durch einen Wörterbuch Zugriff tun können.

Was es kommt darauf an, dass, wenn Sie einen Weg wollen Typen Fehler bei der Kompilierung zu fangen, sollten Sie nicht Python verwenden. Eine Sprache Wahl ist immer eine Reihe von Kompromissen. Wenn Sie Python über C wählen, nur bewusst sein, dass Sie ein starkes Typ-System für eine schnellere Entwicklung traden, besser String-Manipulation, etc.

Ich denke, was Sie suchen Code Testlinie Abdeckung ist. Sie wollen Tests Ihr Skript hinzuzufügen, die sicherstellen, dass alle Ihre Zeilen Code machen, oder so viele wie Sie Zeit haben, testen lassen. Testen ist ein sehr viel Arbeit, aber wenn man die Art der Versicherung wollen Sie fordern, gibt es kein freies Mittagessen, sorry :(.

Wenn Sie mit Eclipse mit Pydev als IDE, kann es Flag viele Fehler für Sie mit rot squigglies sofort und hat Pylint Integration zu. Zum Beispiel:

foo = 5
print food

wird als "Nicht definierte Variable: food" gekennzeichnet werden. Natürlich ist dies nicht immer korrekt ist (vielleicht Essen früher setattr oder andere exotische Techniken definiert wurde), aber es funktioniert gut die meiste Zeit.

In der Regel können Sie nur statisch den Code in dem Umfang analysieren, die Ihren Code tatsächlich statisch ist; desto dynamischer Code ist, desto mehr werden Sie wirklich brauchen, automatisierte Tests.

Der Code wird tatsächlich kompiliert, wenn Sie es ausführen, wird sich beschweren, die Python-Laufzeit, wenn es einen Syntaxfehler in dem Code ist. Im Vergleich zu wie C / C statisch kompilierte Sprachen ++ oder Java, ist es nicht zu überprüfen, ob Variablennamen und Typen korrekt sind -. Für die Sie tatsächlich benötigen, um den Code (zum Beispiel mit automatisierten Tests) durchgeführt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top