Nee, weil es schrecklich ist.
Es ignoriert halt alles, was zu deinem Code gesagt wurde. Sich mit diesem Thema zu beschäftigen ist also reine Zeitverschwendung.
Natürlich kannst du gegen die Progammiersprache programmieren und irgendwie außergewöhnlich schwer verständlichen Coden schreiben. Es ist dann halt aber außergewöhnlich schwer verständlicher Code und hat mit dem, was Python aus macht, nichts zu tun.
Eine gute Lösung für dein Problem wurde dir her im Thread bereits gezeigt. Ich sehe nicht, wo dein Code dem überlegen sein sollte. Ich sehe aber viele Argumente dagegen. Und auch die wurden hier schon alle benannt.
Python 'Benzingespräche'
Also nach seinem letzten Beitrag hat er sich für mich stark trollverdächtig gemacht. Aber wer weiß. Hier tummeln sich ja öfter mal so schräge Vogel rum, die tatsächlich ernst meinen, was sie schreiben.
Vorneweg:
an die TOCTOU-Racecondition z. B. hatte ich zu dem Zeitpunkt einfach nicht gedacht
Wenn das hier so rauskommt tut mir das leid - "schräger Vogel" wäre dann im Vergleich die eher treffende Einschätzung.
Was mir das zeigt:
Die Energie, welche erforderlich wäre, "pythonische" Regeln und Stil einzuhalten, wird keine meiner Optionen sein. Das ist auf einer Ebene zwar schade - die Welt geht dadurch jedoch nicht unter. Wichtig ist, dass mir das klar bewusst ist.
Was folgt daraus?
Python als Werkzeug zur Umsetzung funktionaler anwendungssicherer Programme zu verwenden.
Das "Problem" Lesbarkeit hier auf dieser Ebene stammt mit Sicherheit aus dem Unterschied in der grundsätzlichen "Denke". Wenn jemand - wie praktisch alle hier - mit OOP "aufgewachsen" ist, erscheint die Lesbarkeit "schwierig". Im umgekehrten Fall, wenn jemand OOP nie gelernt oder angewandt hat, kann er mit dem Code hier einigermaßen sicher umgehen.
Ich bin/war(?) tatsächlich dankbar für die vielen Hilfen!
an die TOCTOU-Racecondition z. B. hatte ich zu dem Zeitpunkt einfach nicht gedacht
Wenn das hier so rauskommt tut mir das leid - "schräger Vogel" wäre dann im Vergleich die eher treffende Einschätzung.
Was mir das zeigt:
Die Energie, welche erforderlich wäre, "pythonische" Regeln und Stil einzuhalten, wird keine meiner Optionen sein. Das ist auf einer Ebene zwar schade - die Welt geht dadurch jedoch nicht unter. Wichtig ist, dass mir das klar bewusst ist.
Was folgt daraus?
Python als Werkzeug zur Umsetzung funktionaler anwendungssicherer Programme zu verwenden.
Das "Problem" Lesbarkeit hier auf dieser Ebene stammt mit Sicherheit aus dem Unterschied in der grundsätzlichen "Denke". Wenn jemand - wie praktisch alle hier - mit OOP "aufgewachsen" ist, erscheint die Lesbarkeit "schwierig". Im umgekehrten Fall, wenn jemand OOP nie gelernt oder angewandt hat, kann er mit dem Code hier einigermaßen sicher umgehen.
Ich bin/war(?) tatsächlich dankbar für die vielen Hilfen!
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Nö. Die Einschätzung ist falsch.ulipy hat geschrieben: ↑Donnerstag 9. Dezember 2021, 18:25Das "Problem" Lesbarkeit hier auf dieser Ebene stammt mit Sicherheit aus dem Unterschied in der grundsätzlichen "Denke". Wenn jemand - wie praktisch alle hier - mit OOP "aufgewachsen" ist, erscheint die Lesbarkeit "schwierig". Im umgekehrten Fall, wenn jemand OOP nie gelernt oder angewandt hat, kann er mit dem Code hier einigermaßen sicher umgehen.
Mit Objektorientierung hat dein Code hier nichts zu tun.
Du versuchst hier Erklärungen für schlechten Stil zu finden - da ist aber keine.
Ich wiederhole mich: Wie es richtig, gut und simpel geht wurde hier ausreichend dargelegt. Ganz ohne Objektorientierung.
Was mir fehlt ist deine Erklärung warum deine Lösung mit dem magischen ersten Argument besser sein soll als korrekt benannte Funktionen.
Es sollte selbsterklärend sein, dass dem Leser (und das bist auch du bei deinem eigenen Code)
Code: Alles auswählen
def write_settings(...
Code: Alles auswählen
def read_or_write_settings("write", ...
Als ich von Zeitverschwendung gesprochen habe, meinte ich übrigens eher die Leute, deren Beiträge zu deinem Code du hier ignorierst - nicht dicht.
- __blackjack__
- User
- Beiträge: 13110
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@ulipy: Ich glaube nicht das hier alle mit OOP ”aufgewachsen” sind. Ich zum Beispiel nicht. Und bei der letzten Fragestellung mit der Funktion die mehrere Sachen macht und als Schnittstelle dann ein total undurchsichtiges ``*args`` mit zwei oder drei Argumenten bekommt, hat die Kritik ja auch gar nichts mit OOP zu tun. Das eine Funktion in der Regel genau *eine* Sachen machen sollte und nicht in der Funktion mehrere, sich ausschliessende Pfade existieren sollten, ist etwas das vor 30 Jahren als ich in Pascal, QBasic, und C programmiert habe, schon galt. Da gab es manchmal Gründe Ausnahmen zu machen, die es heute nicht mehr gibt, weil Laufzeit und Speicherverbrauch heute weniger kritisch sind und man beispielsweise nicht mehr darauf achten muss, dass ein Codesegment in 64 KiB passen muss, oder es auch noch Rechner gibt die im einstelligen Mhz-Bereich getaktet sind.
Ausserdem ist OOP ein Paradigma und nicht eine Spracheigenschaft und wenn man OOP gelernt hat, wird man sicher auch APIs in prozeduralen Programmiersprachen ”finden”, die sich sehr objektorientiert anfühlen. Der Schritt in Pascal von RECORD + Prozeduren/Funktion und gelegentlichen Prozedur- und Funktionstypen zu OBJECT und Methoden ist auch kein wirklich grosser. Und diesen Schritt konnte man ja auch vor 30 Jahren schon gehen. Ich hatte den damals im ersten Anlauf nicht richtig verstanden, unter anderem weil ich den entscheidenden Unterschied nicht sah und das erst nur für einen reinen syntaktischen Unterschied wahrnahm eigentlich das gleich zu schreiben, was ich sowieso schon hatte. So richtig Klick gemacht hatte das dann erst Ende der 90er mit Java.
Ausserdem ist OOP ein Paradigma und nicht eine Spracheigenschaft und wenn man OOP gelernt hat, wird man sicher auch APIs in prozeduralen Programmiersprachen ”finden”, die sich sehr objektorientiert anfühlen. Der Schritt in Pascal von RECORD + Prozeduren/Funktion und gelegentlichen Prozedur- und Funktionstypen zu OBJECT und Methoden ist auch kein wirklich grosser. Und diesen Schritt konnte man ja auch vor 30 Jahren schon gehen. Ich hatte den damals im ersten Anlauf nicht richtig verstanden, unter anderem weil ich den entscheidenden Unterschied nicht sah und das erst nur für einen reinen syntaktischen Unterschied wahrnahm eigentlich das gleich zu schreiben, was ich sowieso schon hatte. So richtig Klick gemacht hatte das dann erst Ende der 90er mit Java.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@sparrow
Die gewählte Lösung wird dadurch selbstverständlich in keiner Weise "besser", verglichen mit "guten" Standards.
(Dazu eine weiter Anmerkung in der Antwort auf @__blackjack__)
Ok, das ist mit Sicherheit überwiegend, jedoch nicht ausschließlich, einem minimalistischen Ansatz zu verdanken. Dies kann ohne Übertreibung als "Eigenart" meinerseits gesehen werden....
Was mir fehlt ist deine Erklärung warum deine Lösung mit dem magischen ersten Argument besser sein soll als korrekt benannte Funktionen.
...
Die gewählte Lösung wird dadurch selbstverständlich in keiner Weise "besser", verglichen mit "guten" Standards.
(Dazu eine weiter Anmerkung in der Antwort auf @__blackjack__)
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
@__blackjack__
Am Ende steht hier vor allem diese Geschichte:
"eine" anstelle von "zwei" Funktionen:
Es ist für mich auch beim allerbesten Willen schlicht unmöglich, in diesem Falle zwei Funktionen zu verwenden, wenn ich durch eine vielleicht etwas "eigene" Art erreiche, NIEMALS NICHT mehr über "settings" nachdenken zu müssen - in keiner Form, zu keinem Zeitpunkt, so lange nicht, bis sich etwas grundlegendes ändert.
Die Verwendung der *args hier erscheint mir persönlich dabei nun (in der aktuellen Form) tatsächlich nicht schwierig nachzuvollziehen, gleich, mit welcher persönlichen Geschichte man da herangeht.
Wenn jemand den docstring liest, hat er eigentlich alles, meine ich jedenfalls (ich kann damit natürlich falsch liegen - das würde dann jedoch entsprechende konkrete Argumente benötigen, was genau daran eigentlich "schwierig" ist. Solche kann ich hier bis heute jedenfalls nicht sehen.)
Alleine die Befolgung von Standards, hier, in diesem Falle, wird - für mich zumindest - kein Grund für einen Ansatz mit zwei Funktionen sein können.
So ticke ich halt..
ja, das ist als bekannt vorauszusetzen, ebenso OOP als Paradigma (nicht als besondere "Eigenschaft" einer bestimmten Sprache).@ulipy: Ich glaube nicht das hier alle mit OOP ”aufgewachsen” sind. Ich zum Beispiel nicht.
Am Ende steht hier vor allem diese Geschichte:
"eine" anstelle von "zwei" Funktionen:
Es ist für mich auch beim allerbesten Willen schlicht unmöglich, in diesem Falle zwei Funktionen zu verwenden, wenn ich durch eine vielleicht etwas "eigene" Art erreiche, NIEMALS NICHT mehr über "settings" nachdenken zu müssen - in keiner Form, zu keinem Zeitpunkt, so lange nicht, bis sich etwas grundlegendes ändert.
Die Verwendung der *args hier erscheint mir persönlich dabei nun (in der aktuellen Form) tatsächlich nicht schwierig nachzuvollziehen, gleich, mit welcher persönlichen Geschichte man da herangeht.
Wenn jemand den docstring liest, hat er eigentlich alles, meine ich jedenfalls (ich kann damit natürlich falsch liegen - das würde dann jedoch entsprechende konkrete Argumente benötigen, was genau daran eigentlich "schwierig" ist. Solche kann ich hier bis heute jedenfalls nicht sehen.)
Alleine die Befolgung von Standards, hier, in diesem Falle, wird - für mich zumindest - kein Grund für einen Ansatz mit zwei Funktionen sein können.
So ticke ich halt..
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Was ist daran minimalistisch? Es ist doch undurchschaubar und komplex. Statt zwei Funktionen eine zu bauen, die dann innen drin wieder per if unterscheiden, worum es geht, ist nicht weniger. Es ist nur weniger strukturiert
Dann brauchst du aber kein Forum.
Dann brauchst du einen einsamen Platz, wo du in deinem eigenen Saft schmoren möchtest..
Offensichtlich möchtest du, dass dir hier irgendw jemand sagt, dass dein Code in Ordnung ist. Ist er nicht. Du wirst dafür von keinem hier Absolution erhalten.
Deine Argumente, warum der Code so sein sollte sind augenscheinlich falsch (das wird einem spätestens klar, wenn die vorgeschlagene Lösung und deine nebeneinander liegen - dann ist sehr offensichtlich, welche von beiden minimalistisch ist).
Da du also keine nachvollziehbaren Argumente bringen kannst und alle Tipps ignorierst bin ich mal raus.
@ulipy: Wenn der Code für dich so gut verständlich ist, wo ist das Problem?
Insbesondere nach den etlichen Iterationen hier im Thread sollte der Code also nicht nur richtig funktionieren, sondern auch gut getestet sein. Wenn da jetzt also immer noch ein Fehler drin wäre... würde das dann nicht zeigen, dass der Code nicht gut verständlich bzw. zu komplex ist? Zum Beispiel weil ein Randfall übersehen wurde, der nicht auftreten kann, wenn du den Code in sinnvolle Funktionen aufteilst?
Insbesondere nach den etlichen Iterationen hier im Thread sollte der Code also nicht nur richtig funktionieren, sondern auch gut getestet sein. Wenn da jetzt also immer noch ein Fehler drin wäre... würde das dann nicht zeigen, dass der Code nicht gut verständlich bzw. zu komplex ist? Zum Beispiel weil ein Randfall übersehen wurde, der nicht auftreten kann, wenn du den Code in sinnvolle Funktionen aufteilst?
Ok, es ist ohne Frage weniger strukturiert - undurchschaubar würde ich es jetzt nicht nennen können - jeder hier hat das durchschaut, so weit ich das mitbekommen habe
Wenn du das so siehst - ich kann dich nicht daran hindern. "Keine" Argumente gebracht und "alle" Tipps ignieriert habe ich jedenfalls m. W. nicht.
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Hatte deinen Einwurf nicht rechtzeitig gesehen.
Bin mir fast sicher, dass dir selbst klar ist, dass die Schlussfolgerung(en) logisch gesehen so nicht wirklich "legitim" sind - jedenfalls gibt es mit Sicherheit noch viele "Problemchen..", die dann eben auch speziell mit Python Syntax etc. zu tun haben.
Hätte ich die "42" richtig gut verstanden, wäre dies natürlich obsolet
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
@ulipy: Ich bin mir sicher, dass du deine Funktion nie mit null Argumenten getestet hast, aber (fehlerhaften) Code geschrieben hast, der das behandeln soll. Dass dir das nicht aufgefallen ist, zeigt, dass der Code zu komplex ist. Insbesondere auch, weil die Prüfung komplett überflüssig wäre, wenn du den Code auf zwei Funktionen aufgeteilt hättest.
Ja, ok, als "Ausweis" für eine "gute" oder gar vorzuziehende Herangehensweise hatte ich dies m. W. unmissverständlich weder gesagt oder dargestellt, denke ich zumindest - gemeint sowieso nicht
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Absolut einverstanden - danke!narpfel hat geschrieben: ↑Donnerstag 9. Dezember 2021, 21:23 @ulipy: Ich bin mir sicher, dass du deine Funktion nie mit null Argumenten getestet hast, aber (fehlerhaften) Code geschrieben hast, der das behandeln soll. Dass dir das nicht aufgefallen ist, zeigt, dass der Code zu komplex ist. Insbesondere auch, weil die Prüfung komplett überflüssig wäre, wenn du den Code auf zwei Funktionen aufgeteilt hättest.
Es fand bisher kein nennenswertes Testen statt und ich war und bin absolut nicht der Ansicht, dass der Code - so wie er gerade ist - bereits zuverlässig verwendbar wäre.
Im Gegenteil - es war klar, dass das rein logische Nachvollziehen hier nicht ausreichernd ist, genau wegen dieser Struktur..
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Jetzt muss ich doch sofort nachfragen - das ist erst mal sehr überraschend:@ulipy: Ich bin mir sicher, dass du deine Funktion nie mit null Argumenten getestet hast, aber (fehlerhaften) Code geschrieben hast, der das behandeln soll. Dass dir das nicht aufgefallen ist, zeigt, dass der Code zu komplex ist. Insbesondere auch, weil die Prüfung komplett überflüssig wäre, wenn du den Code auf zwei Funktionen aufgeteilt hättest.
Weshalb genau ergibt dies einen Laufzeitfehler - ein solcher is ja deutlich unwillkommener als eine Parser-Meldung...
Mit
passiert das nicht mehrif 1 < len(args) > 3 or len(args) == 0:
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität