BlackJack hat geschrieben:@Aries: Wenn das:
Code: Alles auswählen
get_number_i_defined_earlier = itemgetter(1)
get_defnum = itemgetter(1)
``get_second = itemgetter(1)`` ersetzen soll, dann muss man doch erst recht das machen was Du nicht so gut findest: Die Definition suchen weil der Funktionsname nichts darüber aussagt welches Element da eigentlich geholt wird.
Mein Argument scheint nicht durchzudringen, vielleicht beachte ich auch einfach etwas nicht, worauf man erst aufmerksam wird, wenn man länger mit Python programmiert hat, aber ich versuche es nochmal:
Entweder get_second/get_defnum/get_wieauchimmer wird während der Programmentwicklung verändert. In dem Falle sollte man sich nicht auf den Namen verlassen, sondern vielmehr sollte der Name die Veränderlichkeit andeuten.
Oder get_second/get_defnum/get_wieauchimmer wird während der Programmentwicklung nicht verändert. In dem Falle ist der Name überflüssig und man kann stattdessen direkt das schreiben als was er definiert ist.
BlackJack hat geschrieben:Das war ja einer der Gründe warum ich überhaupt einen Namen dafür eingeführt habe. Es ging darum einer abstrakter formulierten Operation einen konkreteren, verständlicheren Namen zu geben. Das ist alles andere als „sinnlos”, sondern es hilft beim Verständnis des Programms.
Um ein Programm zu verstehen, könnte man auch ein Buch darüber schreiben. Aber hier geht es doch auch darum, zu lernen, wie man ein Programm schreibt. Und dazu muss man sich nunmal auf die Programmiersprache und damit programmiersprachliche Ausdrücke wie itemgetter(1) herablassen.
BlackJack hat geschrieben:Da hast Du aber anscheinend nichts übrig für wie Dein Beispiel mit der ``for``-Schleife zeigt. Was mir echt Angst macht. Ich würde keinen Code von Dir warten wollen, wenn da alles so generisch wie möglich benannt ist, damit man ja nichts falsch benennt.
Vielleicht irre ich mich hier, mit einer for-Schleife dieser Art habe ich bislang kaum Erfahrung.
BlackJack hat geschrieben:
Das schützt überhaupt nicht vor dem „Fehler” wie Du behauptest. Wenn im unteren Beispiel der Name nicht zu den Elementen im iterierbaren Objekt passt, dann machst Du als Programmierer eine falsche Annahme über die Elemente und behandelst sie im Schleifenkörper höchstwahrscheinlich falsch. Dadurch ändert sich nichts auf magische Weise wenn Du den generischen, und damit automatisch immer richtigen Namen `objekt` für die Elemente verwendest — im Schleifenkörper wird immer noch das falsche mit den Elementen gemacht.
Ich meine nur, das man so vielleicht leichter auf den Fehler kommt.
BlackJack hat geschrieben:
Versetzen wir uns in die Lage von jemandem der den Fehler finden soll. Der sieht ``for objekt in container:`` im Vergleich zu z.B. ``for parrot in parrots:``, lässt sich mit `type()` mal den Typ von der Schleifenvariablen ausgeben und bekommt 'Cat' als Ergebnis. In welchem der beiden Fälle weiss er wohl sofort dass hier der Typ falsch ist, und in welchem muss er weiterforschen‽
parrot und parrots sind vielleicht etwas verwechselbar. Meine Idee wäre hier: "for objekt in parrots:"
Nehmen wir an, man will prüfen ob sich in parrots nur Papageien befinden, dann wäre es etwas widersinnig, das zu prüfende schon vor der Prüfung parrot zu nennen.
Nehmen wir an, der dem for-Ausdruck untergeordnete Code-Abschnitt ist lang, dann ist es womöglich in ihm weiter unten nicht sofort ersichtlich, worum es sich bei parrot handelt. Wenn man hingegen in gewissen Fällen in for-Ausdrücken einheitlich objekt schreiben würde, wüsste man weiter unten bei objekt sofort, dass es sich um den Namen aus dem for-Ausdruck handelt.
Aber wie gesagt, dabei habe ich noch kaum Erfahrungen gesammelt.