Erstmal würde ich `Decimal` rauswerfen. Ich kann mir nicht vorstellen, dass die Programme von denen die Daten stammen, nicht mit der Fliesskommaarithmetik auskommen, die die Hardware bietet.
Dann solltest Du das Parsen der Dateien in einzelne Funktionen aufteilen und mit dem `profile`- und/oder `hotshot`-Modul herausfinden wo am meisten Zeit verbraucht wird.
Mit ungünstig formulierten regulären Ausdrücken kann man sehr lange Laufzeiten hinbekommen.
Ich kenne die Dateiformate nicht, aber es sieht ein bisschen so aus, als wenn Du beim Verarbeiten des Inhalts der letzten Datei wieder Informationen aus der `def_datei` mittels regulärer Ausdrücke heraus holst, die weiter oben schon einmal geparst wurden, oder es vielleicht sollten.
Zum Stil möchte ich mich jens anschliessen: Nicht jede Klasse braucht eine eigene Datei. Insbesondere bei Klassen, die thematisch so dicht zusammenhängen wie im vorliegenden Fall. Damit fallen dann auch die ganzen bösen '*'-Importe weg.
Ausserdem sollte man alle Attribute möglichst in der `__init__()`-Methode an das Objekt binden. Wenn in anderen Methoden noch welche neu entstehen, dann ist das nicht besonders übersichtlich. Nach `__init__()` sollte die Initialisierung nach Möglichkeit wirklich abgeschlossen und das Objekt benutzbar sein.
Die `*Array`-Klassen sind nicht notwendig, da sie keine weiteren Funktionen enthalten und der Suffix 'Array' ist auch nicht so ganz passend. Bei Arrays erwarten die meisten Leute, dass man dort mit einem Index zugreift und nicht mit einem Schlüssel. Wobei hier noch nicht einmal eine Möglichkeit geschaffen wurde auf die Objekte per Index oder Schlüssel zuzugreifen. Langes "durchgreifen" durch Objekte ist im allgemeinen kein guter Stil, weil man auf diese Weise meistens zu viele Annahmen über Objektinterna macht:
Code: Alles auswählen
x = [self.pinarray.pins.get(pin).x for pin in net.pins]
# =>
x = [self.pinarray[pin].x for pin in net.pins]
Im zweiten Fall wäre man unabhängig von der internen Organisation der Pins im `PinArray`.
OOP-technisch gesehen ist auch noch nicht alles so sauber aufgeteilt. Die Entfernung zwischen zwei Punkten wäre zum Beispiel etwas das prima als Methode auf einem Punkt-Objekt passt. Bei der Formel fehlt glaube ich auch noch etwas.
Am Ende einer Funktion oder eines Programms Namen mit ``del`` zu entfernen macht keinen Sinn.