directory index building - 6 ============================ :date: 2020-04-17 11:50 Es braucht eine ``type`` für Dokumente. Bis jetzt sind es Berichte und ich möchte Aufgaben dazu tun, die Abgaben sind dann Berichte. Am Ende von mkindexes.py:: # Ausgabe html: sortiert nach type liste.sort(key=lambda p: str(p.author + p.path.stem).lower()) wr_html_file("index-type.html", root_files, liste, lambda p: p.type) in der info-Datei:: { "author": "e", "complang": "arduino", "type": "aufgabe" } Das Programm stürzt ab weil p.type nicht existiert. Initialisieren mit default-Wert:: class Document(): """ Document hat ein pathlib.Path (ist nicht erweiterbar) und ein paar andere Attribute. """ def __init__(self, pathlibPath): self.path = pathlibPath self.name = self.path.name self.parent = self.path.parent self.author = "system" self.complang = self.path.suffix self.type = "bericht" self.read_attributes() Danach wird alles unter "bericht" einsortiert, weil Document.read_attributes den wert aus der info-Datei noch nicht übernimmt. Da steht:: def read_attributes(self): """ read attribute file if present. """ iPath = self.path.with_suffix(".info") if iPath.exists(): # TODO with context ? try: a = json.load(iPath.open()) except: print("Error: json.load(%s)" % iPath) raise # TODO how to move all into attributes ? if "author" in a: self.author = a["author"] if "complang" in a: self.complang = a["complang"] Die schnelle Lösung:: if "type" in a: self.type = a["type"] Fehler '''''' Es muss nach type sortiert werden:: # Ausgabe html: sortiert nach type liste.sort(key=lambda p: str(p.type + p.path.stem).lower()) Zuweisung auf ein Attribut -------------------------- In der info-Datei haben wir ein Dictionary, das ist ein Array/Liste auf die mit Zeichenketten/Strings zugegriffen werden kann. Ein "normales" Array:: a = [ "ab", "jetzt", "und", "so", "weiter" ] a[2] # ist "und" ein Dictionary:: d = { "ab" : "jetzt", "2": "und", "so": 1.234, "weiter": "2020-04-18" } d["2"] # ist "und". "2" ist ein String. Geht aber auch mit Zahlen:: >>> d[2] = "geht auch" >>> d {'ab': 'jetzt', '2': 'und', 'so': 1.234, 'weiter': '2020-04-18', 2: 'geht auch'} In der Document-Klasse greifen wir aber mit p.type zu, das ist ein Attribut. Ich möchte gerne:: a = json.load(... for k in in a: self.k = a[k] >>> a {'author': 'e', 'complang': 'arduino', 'type': 'aufgabe'} >>> for k in a: x.k = a[k] ... >>> x.type 'bericht' >>> x.k 'aufgabe' Es wird ein neues Attribut ``k`` angelegt. Einmal google falsch ... dann die richtige Frage: python access object attribute by name und die Antwort ist: getattr(object, attrname) setattr(object, attrname, value) für uns:: # move all into attributes for k in a: setattr(self, k, a[k]) 12:23