Erstmal danke dass du dir Zeit genommen hast und danke für das Feedback

In jeden Sourcefile den ich gesehen habe steht das aber so. Selbst in den Libs von Python. Warum sollte ich das jetzt ändern?
Leonidas hat geschrieben:
Zeile 83: Was ist denn das? Warum ist in
nicht
(welches PEP8 konform und auch noch beschreibender wäre, du siehst, Exception-Namen haben kaum Abkürzungen: AttributeError statt AttrError oder E_ATTRERR).
Werde ich ändern. Danke für den Hinweis. Also gilt hier der Name des Moduls (oder Klasse??) + Error als postfix?
Leonidas hat geschrieben:
Was macht die Klasse mehr als ein
? Ich habe das gefühl, dass es nur unnötiger Boilerplate-Code ist. Statt Error-Codes sollte man besser andere Exceptions definieren, denn Exceptions sind ja dafür da nichtssagende Error-Codes wie 1000 zu ersetzen.
Ein pass?? Ne beim besten willen nicht. Schau mal in Zeile 251-254. Dort wird eine Exception vom Type MB_ERR_GTRG_UNKNOWNMODE ausgelöst. Es bleibt jeden selber überlassen ob der die Exception abfängt und dann den Standard text ausgibt...
Code: Alles auswählen
try:
[…]
data = bench.GetRanking("modus falsch")
except BenchError, err:
print err
Oder ob er das so macht:
Code: Alles auswählen
try:
[…]
data = bench.GetRanking(“modus falsch”)
except BenchError, err:
if err.errorNum == MB_ERR_GTRG_UNKNOWNMODE:
print "Der übergebene Modus an GetRanking() ist unbekannt!"
if err.errNim == xyz # dies ist noch nicht implementiert. Es soll noch für eine Methode eine Exception implementiert werden.
[…]
Zweite Variante ist flexibler, weil man dann im try block alle Methoden verwenden kann von Benchmark und nicht in getrennten try blöcken
(Zu viel code). Und falls irgend eine Methode eine Exception auslösest kann man mit if vergleichen welcher Fehler dafür gesorgt hat. Ein anderer Vorteil ist, das man eine Individuelle Fehlermeldung ausgeben kann.
Es gibt doch einige Exceptions die selber ein errno in der Exception Klasse definieren und das einen Error-Code enthält. Daher habe ich das ja. Die werden das ja aus den gleichen Grund haben oder

Oder willst du mir jetzt sagen das ich lieber für jeden Fehler Typ, den eine Methode von Benchmark auslösen könnte, eine eigene exception definieren soll?

Was ist den Pythonischer? Ich dachte ich könnte so eine Exception (in den Fall BenchErro bzw. BenchmarkError) definieren und müsste nicht für jeden Fehler ne eigene Klasse machen
Leonidas hat geschrieben:
Zeile 108: Warum definierst du hier alles mit einem Bodenstrich? Unnötig und macht es schwerer lesbar.
Ich habe gelesen und auch BlackJack (in Pythons OOP erklärt) hat gesagt das man alle Methoden und alle Attribute die nicht Public sind, mit einen unterstrich am anfange definiert. Das finde ich sinnvoll weil keiner diese Sachen anfassen soll und ich die auch nicht dokumentieren werde, wie es schon in PEP8 vorgeschlagen wird. Also
self._functions, self._data, self._refTime sind für Interna bestimmt (also private) und sollen von außen _nicht_ angerührt werden. Falls ich damit falsch liege und es nicht so ist dann bitte berichtigen. Aber in dem Fall bin ich mir 100% sicher das man so Private Sachen definiert und werde es auch so beibehalten.
Leonidas hat geschrieben:
Zeile 140: nicht PEP8 kompatibel
Warum ist
Code: Alles auswählen
self._functions.append( [ref.__name__, comment, ref, args] )
Nicht PEP8 kompatibel

Wegen den Leerzeichen? Sollte es so aussehen?:
Code: Alles auswählen
self._functions.append([ref.__name__, comment, ref, args])
Leonidas hat geschrieben:
Zeile 154: self._data[0][0], [0][0] sieht sehr nichtssagend aus, vielleicht kann an hier eine andere Datenstruktur verwenden? Zum Beipiel ein Dict, mit einer Listen innen drin, oder sowas ähnliches?
Ok werde ich ändern, aber nicht als Dict mit listen drin, sonder als List mit Dicts drin, Weil...
Code: Alles auswählen
bench = Benchmark()
[...]
bench[0]['time'] # Laufzeit von Funktion 1.
bench[1]['time'] # Laufzeit von Funktion 2, etc.
[...]
Dan kann man leicht darüber iterieren und braucht dann nur mit den Keys darauf zurückgreifen.
Leonidas hat geschrieben:
Zeile 159: nicht PEP8 kompatibel
Zeile 168: dito
Ok, danke für den hinweis. Stimmt die Leerzeichen zwischen "-" und * und 80 Fehlt.
Leonidas hat geschrieben:
Zeile 170: BM_GTRG_MODE_LIST finde ich völlig unnötig. Warum sollte man, wenn man schon die Möglichkeit hat, ein Dict zu bekommen, lieber eine undurchsichtige Struktur wie List haben wollen, bei der nicht sofort klar ist, welcher Index was für einen Wert repräsentiert? Klar, man kann Doku lesen, aber wenn man ein Dict hat, braucht man die Doku nicht mal anzusehen, es ist sofort klar.
Ganz einfach wegen den Beispiel in Zeile 286:
Code: Alles auswählen
print "\n--- Ranking mit GetRanking() als Array von Arrays holen und ausgeben ---"
data = bench.GetRanking()
print "Funktion: %2s - %-10s ist am langsamsten; Zeit: %f sec" %(
data[0][2], data[0][1], data[0][0]
)
for time, comment, name, percent in data[1:]:
print "Funktion: %2s - %-10s ist um %.2f%% schneller; Zeit: %f sec" % (
name, comment, percent, time
)
Das sieht übersichtlicher bzw. ist einfacher als Zeile 296:
Code: Alles auswählen
print "\n--- Ranking mit GetRanking() als Array von assoziative Arrays holen und ausgeben ---"
data = bench.GetRanking(BM_GTRG_MODE_DICT)
print "Funktion: %2s - %-10s ist am langsamsten; Zeit: %f sec" %(
data[0]['name'], data[0]['comment'], data[0]['time']
)
for dat in data[1:]:
print "Funktion: %2s - %-10s ist um %.2f%% schneller; Zeit: %f sec" % (
dat['name'], dat['comment'], dat['percent'], dat['time']
)
Aber ok, ich werde das ändern und dann mal zum abgleich (ohne docstrings. das kommt dann Später) hier mal posten ob die Änderungen dann so passen
Danke dir vielmals, hab heute viel gelernt

Durch deine Hinweise weiß ich nun, das ich in viele scripte von mir richtig scheiße gebaut habe ^^
Aber wenn du Zeit hast könntest du ja die von mir kommentierten Sachen beantworten, weil ich mir da nicht sicher bin ob ich richtig liege.
thx & lg xtra
EDIT: Rechtschreibfehler verbessert.