ich bin in der Programmiersprache Python relativ neu, beherrsche aberbereits 1-2 andere (C und C++). Ich wollte mich für komplexere Aufgaben hier geistig etwas erweitern und habe daher angefangen Python zu lernen.
Hier habe ich jetzt eine kleine (aber für mich wichtige) "Übung".
Ich möchte ein Chunkformat decodieren und die darin enthaltenen Daten extrahieren und Informationen in einem Log festhalten.
Der Dateiaufbau ist ganz typisch:
1. 32-Bit Type (Integer LE)
2. 32-Bit Length (Integer LE)
3. Content (<length> Bytes)
Das ganze natürlich hierarisch, also es ist eine Art "List"-Chunktyp vorhanden. Ein Chunk könnte auf mal 4GiB groß sein. Auf parallele Auswertung muss ich vorerst nicht achten, das schaue ich mir später mal bei einem anderen Projekt an.
Ich habe mir das ganze wie folgt vorgestellt:
1. Eine Instanz der Klasse Reader liest aus der Datei 2x 4 Byte (Length und Type)
2. Type wird ausgewertet, für jeden möglichen wird gibt es eine Seperate Klasse die dessen Verarbeitung übernimmt (bekommt das Dateiobjekt übergeben um Daten selbst einlesen zu können) -> von der jeweiligen Klasse wird eine Instanz erstellt.
Alle Chunk-Typ-Klassen erben von einer Basisklasse Chunk.
Jetzt zu meiner Frage:
Aus C kenne ich das switch-case-Konstruk, welches es ja in Python3 nicht gibt. Ich könnte jetzt einfach ein sehr langes if-else bauen, welches alle möglichen Typen und die zugehörigen Klasseninstanzierungen enthält. Aber irgendwie finde ich das nicht schön. Etwa so (Code nicht ausformuliert, nur zur Anschauung):
Code: Alles auswählen
class Chunk:
def __init__(self, f, length):
#tue was für alle Chunks gleich ist
#Typ 0 ist der Headchunk
class ChunkTyp0(Chunk):
def __init__(self, f, length):
Chunk.__init__(self, f, length)
while length > 0:
itype = int.from_bytes(f.read(4), byteorder='little')
ilength = int.from_bytes(f.read(4), byteorder='little')
length -= ilength + 8
if type == 0
obj = ChunkTyp0(f, length)
elif type == 1:
obj = ChunkTyp1(f, length)
elif type == 2:
obj = ChunkTyp2(f, length)
else:
print('Unknown Chunktype')
f.read(ilength)
class ChunkTyp1(Chunk):
def __init__(self, f, length):
Chunk.__init__(self, f, length)
#Verarbeite den Chunk
class ChunkTyp2(Chunk):
def __init__(self, f, length):
Chunk.__init__(self, f, length)
#Verarbeite den Chunk
class Reader:
def __init__(self, f)
while True:
type = int.from_bytes(f.read(4), byteorder='little')
length = int.from_bytes(f.read(4), byteorder='little')
if length == '':
break
if type == 0
obj = ChunkTyp0(f, length)
elif type == 1:
obj = ChunkTyp1(f, length)
elif type == 2:
obj = ChunkTyp2(f, length)
else:
print('Unknown Chunktype')
break
if __name__ == '__main__':
with open(argv[1], "rb") as f:
main_Reader = reader(f)
Viele Grüße und danke für euren Input