Seite 3 von 3

Re: Instanzenbildung aus Datei

Verfasst: Mittwoch 26. Mai 2021, 23:52
von __blackjack__
@LukeNukem: Du kannst mit ein paar Links nicht beweisen das `ifh` und `ofh` auch in Python weit verbreitet sind. Und selbst wenn sie das wären, sind es immer noch keine guten Namen, weil a) kryptisch abgekürzt und b) inhaltlich falsch. Nur weil etwas nicht in PEP8 steht, heisst das nicht automatisch es ist gut oder sinnvoll oder leicht lesbar.

Mit der Argumentation das ein Dateiobjekt ein Handle ist, ist *jedes* Objekt in Python ein Handle, also könnte man an jeden Namen `_handle` oder bei schlechten Abkürzungen `h` hinten anhängen. Wenn man das aber an jeden Namen anhängen kann, dann ist der Informationsgehalt davon gleich Null und man sollte den unnötigen Zusatz weg lassen, und so würde dann aus dem `input_file_handle` nur noch `input_file`. Also das was ein guter, passender Name ist. 🙂

Nochmal: `file` bricht keine Abwärtskompatibilität. Das das in Python 2 mal ein Datentyp war, ist in Python 3 Code nicht mehr relevant. Und ja, natürlich ist `file` sehr generisch, aber Du sagst es ja selbst: In dem Fall wird das genau zweimal in aufeinanderfolgenden Zeilen benutzt. Und es ist ein besserer, weil für mehr Leute auf Anhieb verständlicherer Name als das kryptische `ifh`.

Das Python 2 noch irgendwo verwendet wird, ich habe da noch Code der in einem Fall bis Python 2.4 zurück geht, weil auf dem Gerät wo das läuft, nichts aktualisiert werden kann, kann man bedenkenlos `file` verwenden. Der Zweck davon ist das man davon ableiten kann. Wird sehr selten gebraucht, und selbst wenn, dann eher nicht *in* einer Funktion in der man den Bezeichner vorher für ein Dateiobjekt verwendet hat.

Hier im Forum gehe ich von Code aus, der aktuelle CPython-Versionen verwendet. Also zumindest die älteste offiziell unterstützte Version. Und da ist Python 2 raus. Wenn dann jemand Probleme damit hat das auf einem älteren/alternativen Python zum laufen zu bringen, muss er das halt ansagen. Das halte ich auch für ein Strohmann-Argument, weil Du ja selbst sagst, dass Du Features benutzt die nach Python 2 eingeführt wurden. Entweder ganz oder gar nicht. Und dann bitte auch getestet, das es auf Python 2 *und* 3 läuft. Ach ja, und bitte auch all die Einschränkungen berücksichtigen wo PyPy, Jython, IronPython, nuitka, Bython, Shed Skin, und PyJS von CPython abweichen. Das muss natürlich auf allen gleich laufen. Haben wir MicroPython/CircuitPython noch vergessen? Bin auf Dein nächstes Codebeispiel gespannt. 🙂

Das was man mit `open()` & Co öffnet ist eine Datei. Und dafür gibt es den (Duck)-Typ `File` der das Konzept ”Datei” mit den Operationen repräsentiert. Und ein passender Name für so ein Exemplar ist `file`. Es ist kein Handle. Es enthält/kapselt eines. Es ist aber mehr als das, mehr als ein Wert den man als Stellvertreter an andere Funktionen übergibt. Das ist was ein Handle ist, ein passiver, opaker Wert ohne weitere Eigenschaften, den man als Stellvertreter für ein Objekt, das in einem anderen Namensraum verwaltet wird, übergeben kann. Also zum Beispiel das was `os.open()` zurück gibt. Wenn `file_handle` ein passender, generischer Name wäre, dann würde man den Datentyp dazu ja `FileHandle` nennen. Der heisst aber `File`, beziehungsweise als es den in Python 2 noch als *einen* konkreten Typ gab, hiess der `file`. Und nicht `file_handle` oder `FileHandle`. Ein `file_handle` wäre ein Attribut, ein Bestandteil von so einem Datentyp, aber eben nicht der Datentyp selbst.

Das ein Objekt ein informelles Protokoll unterstützt, ist doch nichts anderes als Duck-Typing. Wenn es läuft wie ein Dateiobjekt und quakt wie ein Dateiobjekt, dann ist es ein Dateiobjekt, oder eben zumindest ein dateiähnliches Objekt.

Mit `sort()` verstehe ich jetzt wieder nicht was Du damit eigentlich sagen willst, denn ja, das verändert die Liste und gibt deswegen nicht die Liste zurück. Das ist so gewollt und pythonisch. Dein `read_csv()` verändert das Objekt und gibt es zurück, was unpythonisch ist, denn hier sollte wie bei `sort()` nichts/`None` zurückgegeben werden.

Pandas verhält sich ebenfalls konform. Du kannst da gerne anderes behaupten, auch immer wieder, dadurch wird das aber nicht wahr. Zeig doch mal Beispiele. In dem verlinkten Artikel waren beispielsweise keine. Im Gegenteil, steht da sogar, dass man in dem fraglichen Fall dann kein „method chaining“ mehr machen kann, weil dann `None` zurückgegeben wird. Da es an der Stelle im jeweiligen Code trivial gewesen wäre ``return self`` statt ``return None`` zu schreiben, sollte man das als bewusste Entscheidung sehen, da keine unpythonische API anzubieten.

Re: Instanzenbildung aus Datei

Verfasst: Donnerstag 27. Mai 2021, 02:09
von LukeNukem
__blackjack__ hat geschrieben: Mittwoch 26. Mai 2021, 23:52 @LukeNukem: Du kannst mit ein paar Links nicht beweisen das `ifh` und `ofh` auch in Python weit verbreitet sind. Und selbst wenn sie das wären, sind es immer noch keine guten Namen, weil a) kryptisch abgekürzt und b) inhaltlich falsch. Nur weil etwas nicht in PEP8 steht, heisst das nicht automatisch es ist gut oder sinnvoll oder leicht lesbar.
Ich habe mit der Suchmaschine "Google" binnen weniger Sekunden fünf Beispiele gefunden, darunter sogar eines aus diesem Forum und von jemandem, der sich ebenso wie Du über diese Benennung echauffiert hat. Wenn Du weitere Beispiele suchst, lade ich Dich herzlich ein, selbst eine dieser modernen Internet-Suchmaschinen zu benutzen, viel Glück!
__blackjack__ hat geschrieben: Mittwoch 26. Mai 2021, 23:52 Mit der Argumentation das ein Dateiobjekt ein Handle ist, ist *jedes* Objekt in Python ein Handle, also könnte man an jeden Namen `_handle` oder bei schlechten Abkürzungen `h` hinten anhängen. Wenn man das aber an jeden Namen anhängen kann, dann ist der Informationsgehalt davon gleich Null und man sollte den unnötigen Zusatz weg lassen, und so würde dann aus dem `input_file_handle` nur noch `input_file`. Also das was ein guter, passender Name ist. 🙂
Wenn Du getan hättest, worum ich Dich mehrmals gebeten habe, nämlich den von mir verlinkten Artikel in der englischsprachigen Wikipedia zum Thema zu lesen, dann wüßtest Du, daß ein "Handle" im Kern eine programmiersprachenseitige Abstraktion zum Zugriff auf eine Ressource ist und zudem meist mit Zugriffsrechten verknüpft ist. Deswegen liegst Du genauso falsch wie Dein Vorposter, der dabei aber wenigstens witzig war. Ein Handle ist insofern etwas, mit dem man eine Ressource handhaben kann. Eine Verbindung zu einer Datenbank. Einen Socket. Eine Speicherregion. Eine Datei. Pseudodateien wie STDIN, STDOUT und STDERR.
__blackjack__ hat geschrieben: Mittwoch 26. Mai 2021, 23:52 Das was man mit `open()` & Co öffnet ist eine Datei. Und dafür gibt es den (Duck)-Typ `File` der das Konzept ”Datei” mit den Operationen repräsentiert. Und ein passender Name für so ein Exemplar ist `file`. Es ist kein Handle. Es enthält/kapselt eines.
Das ist gleichzeitig richtig... und doch wieder falsch. Das, was da gekapselt wird, ist -- absolut richtig -- ein betriebssystemseitiges "Dingsi", das unter UNIX-artigen Betriebssystemen üblicherweise durch eine prozeßlokale, eindeutige Ganzzahl repräsentiert wird und das zwar auch ein Handle ist, aber üblicherweise als Dateideskriptor bezeichnet wird. Unter UNIXoiden gibt es da einige spezielle Dateideskriptoren, zum Beispiel 0 als Handle für STDIN, 1 für STDOUT und 2 für STDERR, die für normale Prozesse in der Regel geöffnet und vorhanden sind, während Daemons (Hintergrundprozesse -- ich glaube, unter Windows nennt sich sowas "Service") nach zwei Kombinationen von fork(2) und exec(2), die den Prozeß vom Parenprozeß und vom Parent-TTY abkoppeln, diese Dateideskriptoren üblicherweise schließen. Da Prozesse beim fork(2) lediglich eine Kopie ihrer selbst und ihrer Betriebsumgebung erzeugen (Copy-on-Write, COW), erben die Kindprozesse natürlich die Dateideskriptoren ihres Elternprozesses und schließen sie -- wenn sie wohlerzogen und sauber geschrieben sind -- auch alle anderen Handles, die nicht zur Interprozesskommunikation mit dem Elternprozeß benötigt werden.

Es ist absolut korrekt, daß ein sogenannter "Dateideskriptor" auch ein Dateihandle ist. Das ändert aber nichts daran, daß weitere Kapselungen dieses Dateideskriptors wie in C die Datenstruktur FILE, in Python der _io.TextIOWrapper und Konsorten, in C++ Instanzen der Kinder, Enkel und Urenkel von std::ios... ebenfalls Dateihandles sind. Nämlich: Abstraktionen in einer Programmiersprache für bestimmte Systemressourcen, namentlich: Dateien. Nur für ein Kind von std::ios, nämlich streambuf, und die Urenkel von std::ios, nämlich die Stringbuffer in sstream, gilt etwas anderes: das sind Abstraktionen für Puffer im Arbeitsspeicher, nicht für Dateien. Aber im Kern gilt auch für diese: es sind Abstraktionen von Systemressourcen und sind damit: Handles.
__blackjack__ hat geschrieben: Mittwoch 26. Mai 2021, 23:52 Es ist aber mehr als das, mehr als ein Wert den man als Stellvertreter an andere Funktionen übergibt.
Lies doch bitte einfach endlich mal den Wikipedia-Artikel. Er ist nicht lang und sollte zumindest für einen Entwickler, der die Dokumentation von Python verstehend lesen kann, auch leicht verständlich sein.
__blackjack__ hat geschrieben: Mittwoch 26. Mai 2021, 23:52 Das ist was ein Handle ist, ein passiver, opaker Wert ohne weitere Eigenschaften, den man als Stellvertreter für ein Objekt, das in einem anderen Namensraum verwaltet wird, übergeben kann. Also zum Beispiel das was `os.open()` zurück gibt. Wenn `file_handle` ein passender, generischer Name wäre, dann würde man den Datentyp dazu ja `FileHandle` nennen.
Wie gesagt: auch das ist ein Dateihandle, wird aber in der Regel als Dateideskriptor bezeichnet. Das scheinen die Python-Entwickler übrigens ganz ähnlich zu sehen, wenn man mal im Sourcecode von CPython in die Implementierung zum Beispiel von Modules/_io/winconsole.c schaut: da heißen die betreffenden Variablen sogar "handle" und sind vom Typ "HANDLE". An anderen Stellen im Python-Code heißen sie "handler". Weil es Handles sind. Oder Handler. Oder etwas, um die Systemressourcen programmiersprachenseitig so zu abstrahieren, daß man damit arbeiten kann.
__blackjack__ hat geschrieben: Mittwoch 26. Mai 2021, 23:52 Pandas verhält sich ebenfalls konform. Du kannst da gerne anderes behaupten, auch immer wieder, dadurch wird das aber nicht wahr.
Ja nee, is klar. Ich hab' gerade mal ein

Code: Alles auswählen

grep -ri "return self$" . | wc -l
im Installationsverzeichnis einer meiner älteren Pandas-Installationen gemacht, die maximal zwei Jahre alt ist. Das Ergebnis ist: mit tests/ 103 Treffer, ohne tests/ 93, und nur in _core/ 69 Treffer. Ja huch.

Re: Instanzenbildung aus Datei

Verfasst: Donnerstag 27. Mai 2021, 06:31
von __blackjack__
@LukeNukem: Das man etwas mit ein paar Links nicht beweisen kann, versuchst Du mit fünf Links zu beweisen. Hm.

Wobei wie schon mehrfach gesagt die Existenz von schlechten Namen nicht beweist, dass das keine schlechten Namen sind. Das Handle bleibt inhaltlich falsch und eine Abkürzung bei der man raten und/oder erst im Netz suchen muss, ist halt immer noch schlechter als ein ausgeschriebener, passender Name.

Die Variablen in `winconsole.c` sind das was ich weiter oben als Handles beschrieben habe: ein einfacher opaker Wert mit dem man nichts anderes anfangen kann als ihn an Systemfunktionen zu übergeben. Die Namensgebung des Datentyps ist keine Entscheidung oder Sichtweise der Python-Entwickler, der Typ kommt aus den Headerdateien der Windows-API. Und etwas vom Typ `HANDLE` dann `handle` zu nennen ist jetzt auch keine grossartige Entscheidung wo man lange drüber nachdenken müsste.

Der Datentyp in den das intern verpackt wird heisst `winconsoleio`, das Typobjekt heisst auf C-Seite `PyWindowsConsoleIO_Type`, und auf Python-Seite `_WindowsConsoleIO`. Da wird nirgends das Wort Handle für etwas verwendet was mehr als der opake Stellvertreterwert ist der in so einem Objekt gekapselt wird.

Netter Versuch mit dem ``grep``. Und wie viele davon sind jetzt unpythonisch? Ich habe das auch mal gemacht und die Dateiliste in ``shuf`` gepiped und die ersten fünf zufälligen Treffer angeschaut. Die waren alle in Ordnung. Du sagst es gibt da so etwas, also gib doch bitte endlich mal Beispiele. Ich gehe da jetzt sicher nicht die ganzen Treffer durch um etwas zu finden von dem *Du* behauptest es existiert. Wie viele von den 103 Treffern betrifft das denn nun tatsächlich?

Re: Instanzenbildung aus Datei

Verfasst: Donnerstag 27. Mai 2021, 07:19
von LukeNukem
__blackjack__ hat geschrieben: Donnerstag 27. Mai 2021, 06:31 @LukeNukem: Das man etwas mit ein paar Links nicht beweisen kann, versuchst Du mit fünf Links zu beweisen. Hm.
Wie lustig, daß Du sogar das schon nötig hast.

Also fassen wir das doch mal kurz zusammen:

- Ein womöglich gar valides Sachargument hast Du nicht zustande gebracht.
- Deine Behauptungen habe ich mit Quellangaben widerlegt.
- Code konntest Du auch nicht zeigen.

Was soll ich da noch sagen? "Du bist mein kleiner Held"?

Hab' einen schönen Tag. Ich bin gerne für Dich da, wenn Du etwas Substanzielles liefern kannst. ;-)

Re: Instanzenbildung aus Datei

Verfasst: Donnerstag 27. Mai 2021, 07:38
von __blackjack__
Ich habe Sachargumente gebracht und die hast Du nicht wiederlegt, weil diese Links das nicht widerlegen. Die zeigen nur Beispiele für schlechte Namen. Warum die schlecht sind, habe ich mehrfach geschrieben.

Re: Instanzenbildung aus Datei

Verfasst: Donnerstag 27. Mai 2021, 18:03
von narpfel
LukeNukem hat geschrieben: Donnerstag 27. Mai 2021, 02:09 Deswegen liegst Du genauso falsch wie Dein Vorposter, der dabei aber wenigstens witzig war. Ein Handle ist insofern etwas, mit dem man eine Ressource handhaben kann.
Witzig‽ Ich habe doch nur konsequent umgesetzt, was du vorgeschlagen hast.

Wo ist denn deiner Meinung nach der qualitative Unterschied zwischen `std::stringstream` (das ja anscheinend eine Systemressource abstrahiert) und... `str`, `int` oder meinetwegen `bytearray` (wenn es mutable sein soll)? Warum ist ein `std::stringstream` ein Handle, ein `int` aber nicht?

Re: Instanzenbildung aus Datei

Verfasst: Freitag 28. Mai 2021, 07:03
von LukeNukem
__blackjack__ hat geschrieben: Donnerstag 27. Mai 2021, 07:38 Ich habe Sachargumente gebracht
Bisher sind es nur (wenngleich wortreiche) Behauptungen. Zu Geschmacksfragen.
__blackjack__ hat geschrieben: Donnerstag 27. Mai 2021, 07:38 und die hast Du nicht wiederlegt, weil diese Links das nicht widerlegen.
Sie belegen, daß meine Bezeichner oft und gerne genutzt werden. Zudem habe ich immerhin Belege gezeigt. Diese werden nicht weniger valide, weil Du sie nicht akzeptieren willst.
__blackjack__ hat geschrieben: Donnerstag 27. Mai 2021, 07:38 Die zeigen nur Beispiele für schlechte Namen. Warum die schlecht sind, habe ich mehrfach geschrieben.
Wieder nur unbelegte Behauptungen...

Re: Instanzenbildung aus Datei

Verfasst: Freitag 28. Mai 2021, 07:07
von LukeNukem
narpfel hat geschrieben: Donnerstag 27. Mai 2021, 18:03 Wo ist denn deiner Meinung nach der qualitative Unterschied zwischen `std::stringstream` (das ja anscheinend eine Systemressource abstrahiert) und... `str`, `int` oder meinetwegen `bytearray` (wenn es mutable sein soll)? Warum ist ein `std::stringstream` ein Handle, ein `int` aber nicht?
Bitte lies den Wikipedia-Artikel [1]. Wenn ich es hier erklärte, würde mir sonst wieder von einem argumentlosen Spitzengehirn vorgeworfen, eine "Wall of Text" zu schreiben und ich werde wieder als Troll diffamiert. ;-)

[1] https://en.wikipedia.org/wiki/Handle_(computing)

Re: Instanzenbildung aus Datei

Verfasst: Freitag 28. Mai 2021, 08:40
von Sirius3
@LukeNukem: ich habe Mitleid mit Dir, weil Du wahrscheinlich auch sonst im Leben mit Deinem Verhalten auf Ablehnung stößt. Du versuchst Deine Hilflosigkeit mit Beleidigungen auszudrücken. Das ist keine gute Lösungsstrategie. Ein guter erster Schritt wäre Selbstreflektion. Ließ nochmal Deine Texte durch und überlege, wie sie auf andere wirken. Wenn Du einen guten Freund hast, bitte ihn, die Texte hier durchzulesen und Dir Feedback zu geben. Besser noch, vor dem Posten gegenlesen lassen.

Re: Instanzenbildung aus Datei

Verfasst: Freitag 28. Mai 2021, 13:02
von LukeNukem
Sirius3 hat geschrieben: Freitag 28. Mai 2021, 08:40 @LukeNukem: ich habe Mitleid mit Dir,
Was für eine glückliche Fügung, daß ich das ich ohnehin nicht hätte haben wollen.
Sirius3 hat geschrieben: Freitag 28. Mai 2021, 08:40 weil Du wahrscheinlich auch sonst im Leben mit Deinem Verhalten auf Ablehnung stößt.
Das kommt zwar manchmal vor, aber erfreulicherweise sehr selten.
Sirius3 hat geschrieben: Freitag 28. Mai 2021, 08:40 Du versuchst Deine Hilflosigkeit mit Beleidigungen auszudrücken. Ein guter erster Schritt wäre Selbstreflektion. Ließ nochmal Deine Texte durch und überlege, wie sie auf andere wirken. Wenn Du einen guten Freund hast, bitte ihn, die Texte hier durchzulesen und Dir Feedback zu geben. Besser noch, vor dem Posten gegenlesen lassen.
Das ist keine Hilflosigkeit, sondern genau das, was Ihr Euch gewünscht habt: Genervtheit. Trotzdem werde ich Deine Vorschläge beherzigen und einige Freunde und Kollegen bitten, sich die betreffenden Threads einmal ihrerseits durchzulesen und mir Feedback zu geben.

Magst Du im Gegenzug bitte einmal darüber nachdenken, wie es auf andere wirkt, wenn sie etwas erklären und dazu ein bisschen Code zeigen, und dann gleich zwei Leute über diesen Code herfallen und sich an lächerlichem Pippifax hochziehen, während sie andererseits nichts, aber auch überhaupt gar nichts zum eigentlichen Thema beitragen können. Und wenn Du gerade bei diesen Überlegungen bist, dann denk doch bitte auch einmal darüber nach, wie es wirkt, wenn jemand sich als Oberlehrer aufspielt und sich über Pippifax echauffiert, den er höchstselbst hier haargenau so gepostet hat -- und dabei gleichzeitig auch noch empfiehlt, die Namen von Builtins zu mißbrauchen und zu überschreiben. Viel Glück!