-
Python Tipps
Autor: darkshines 21.03.17 - 12:38
Du scheinst einen guten Start mit Python hingelegt zu haben. Leider befolgst du ein paar Anti-Pattern die gänzlich untypisch, schwer zu lesen oder ineffizient sind. Ich hätte hier ein paar Verbesserungsvorschläge, als Lernhilfe für später :)
cleanupconfig:
Die Stringmanipulation direkt über Indizes wird meistens vermieden, besonders weil man das mächtige re Modul für Regular Expressions in Python an Bord hat. Die Funktion könntest du umschreiben zu:
import re
return re.sub(r'#.*?\r?\n', '', str)
Damit werden einfach alle Zeichenketten durch den leeren String ersetzt, welche mit einem Pound Symbol anfangen und mit einem Zeilenumbruch aufhören.
parseconfig:
Dictionaries haben eine Funktion iteritems(), die genau das tut, was du dort brauchts. Also:
for idx, config in cfg.iteritems():
self.add_device(idx, config)
getall:
Eine riesige Alarmglocke muss jedesmal in deinem Kopf losschallen, wenn du das Pattern range(len(...)) irgendwo siehst. Wenn es absolut unvermeidbar ist, auf den index zuzugreifen, benutze enumerate(). Obwohl das an der Stelle, ehrlich gesagt, mit der JSON Konvertierung in self.getdevice() wohl zu aufwändig wäre, das anders zu schreiben :)
Wenn du mehr zum "Pythonic way" erfahren möchtest, schau dir die Vorträge von Raymond Hettinger an. Er zeigt auf unheimlich unterhaltsame und sympatische Art und Weise, wie man es meistens besser machen kann, in Python. -
Re: Python Tipps
Autor: xvzf 21.03.17 - 12:46
Danke für die Rückmeldung!
C/C++, Java (Kriegsfuß) bin ich fit drin - Python bin ich immer noch am lernen à la "Learning by doing"!
Das einzige wo ich Python bisher verwendet habe war in einer Vorlesung über Netzwerksicherheit!
Cheers,
Matthias -
Re: Python Tipps
Autor: glasen77 21.03.17 - 15:48
darkshines schrieb:
--------------------------------------------------------------------------------
> cleanupconfig:
> Die Stringmanipulation direkt über Indizes wird meistens vermieden,
> besonders weil man das mächtige re Modul für Regular Expressions in Python
> an Bord hat. Die Funktion könntest du umschreiben zu:
>
> import re
> return re.sub(r'#.*?\r?\n', '', str)
Die Frage ist nur, ob es sich jedes Mal lohnt RegExes zu benutzen, da diese nicht besonders performant sind. Wenn der String immer identisch aufgebaut ist, spricht nichts gegen die Verwendung von Indizes. Das mag bei dem Programm keine Rolle spielen, aber wenn man mal eine Datei mit zig-Millionen Zeilen einlesen muss, addiert sich das ganz schön auf.
> parseconfig:
> Dictionaries haben eine Funktion iteritems(), die genau das tut, was du
> dort brauchts. Also:
> for idx, config in cfg.iteritems():
> self.add_device(idx, config)
".iteritems()" ist Python2, die Syntax für Python3 lautet ".items()". -
Re: Python Tipps
Autor: darkshines 21.03.17 - 15:50
Ha! Ja, Macht der Gewohnheit :) Hier auf der Arbeit sind wir noch nicht auf Python 3 umgestiegen.