EuroPython 2021 – Tag 3

Der Vortrag „Improved web scraping with Python tools and Bash utilities.“ ist leider ausgefallen.

In „Building a clean, maintainable and tested code base“ (von Julian Camilleri) wurde ebenfalls das Thema Clean Code aufgegriffen, und es wurden ein paar Punkte vorgestellt, auf die man als Neuling gleich von Anfang an achten sollte.

Clean Code
Der erste Hinweis ist sehr wichtig, und sollte grundsätzlich beachtet werden. Man kann ihn sich gut merken aufgrund des Kürzels „DRY“.
DRY = don’t repeat yourself; d.h. man sollte unbedingt mehrfaches Vorkommen von Code-Stellen vermeiden. Das kann dazu führen, dass man später an mehreren Stellen Änderungen und Korrekturen durchzuführen hat.

Import
Beim import-Statement gibt es ebenfalls ein paar Aspekte, die man für bessere Übersichtlichkeit und ggfs. für eine einfachere Fehleranalyse beachten sollte.
Keine Aufzähung in einer Zeile: import sys, abc. Dies wird auch laut PEP nicht empfohlen. Nur bei einem „from … import …“ ist es erlaubt.
Man sollte die Reihenfolge der imports beachten: builtin, related 3-rd party, eigene Module. Macnhe IDE unterstützt hier Befehle für „organize imports“, so dass die Sortierung automatisch erledigt werden kann.
Man sollte wildcard-Imports vermeiden, da es zu Verwechselungen kommen kann.
Es wird empfohlen absolute Imports gegenüber relativen Imports zu bevorzugen.

Programmcode
Man sollte auf gute Namen achten (für Funktionen und Variablen), damit man erkennen kann, was gemeint ist, und was im Code passieren soll.
Um den Code besser zu strukturieren und lesbarer zu machen, sollten Spaces und Leerezeilen verwendet werden.
Zur Dokumentation sollte man docstring nutzen, und auch type hint, was außerdem noch zu stabileren Code führt, wenn man vor dem Einsatz des Skriptes, das Typing vorab prüft.
Decoupling vereinfacht ebenfalls den Code. Erfüllt eine Funktion mehrere Aufgaben, dann sollte man dise Taks jeweils in eine eigene Funktion auslagern (eine Funktion = ein Task)

Projekt Struktur
In kleinen Projekten, die voraussichtlich nicht erweitert werden, reichen oft ein paar Skripte mit jeweils ggfs. viel Code aus.
In größeren Projekten, die auch noch wachsen, oder ständiger Veränderung unterworfen sind, sollte man die verschiedenen Module gruppieren und in unterschiedliche Verzeichnissen ablegen. Das führt auch dazu, dass die Skripte jeweils weniger Code enthalten, und dadurch lesbarer und wartbarer werden.

Testing
kurze Vorstellung von doctest – wird direkt in docstring definiert
kurze Vorstellung von pytest – benötigt eigenes Skript für Testfälle

In die Tiefen von Python ging es mit „Pointers? In my Python? It’s more likely than you think“ (von Eli Holderness).
Wer aus einer anderen Programmiersprache kommt, dem sind vermutlich Pointer vertraut. Ganz einfach ausgedrückt: Es sind Zeiger auf Speicheradressen von Objekten.
So ist z.B. der Name einer Variable ein Pointer auf die Speicheradresse des Objektinhalts. Man kann sich dies sehr gut veranschaulichen auf der Seite vom Pythontutor.
Mit diesem Tool kann man ein wenig hinter die Kulissen von Python schauen, und sich anzeigen lassen, was im Arbeitsspeicher passiert.
Dieses Werkzeug agiert in gewisser Weise wie ein Debugger, man geht Schritt für Schritt die Befehle durch, und lässt sich den Inhalt, und noch viel wichtiger, die Adressierung der Variablen anzeigen.

Wenn man manchmal seltsames Verhalten vermutet im Skript, dann sollte man nach pointer aliasing (Zeigerüberlagerung) schauen.
Beispiel:
a = ['a', 'b', 'c']
b = a
b.append('d') -> Liste b wird ergänzt
print(a)
>>> ['a', 'b', 'c', 'd'] <- auch Liste a wurde geändert!

Arbeitet man mit Objekten, in diesem Fall mit Listen, dann ist es u.U besser b = a.copy zu verwenden.
Und wenn eine Liste weitere Listen bzw. Objekte enthält, die Pointer sind, dann ist b = a.deepcopy notwendig.
Damit gilt:
b = a: es sind identische Objekte
b = a.copy: es wird ein neues Objekt b erzeugt, eventuell im Objekt ewitere vorhandene Pointer bleiben erhalten, z.B. Listen in einer Liste.
b = a.deepcopy: es werden alle Objekte neu erzeugt

Ein Tuple ist zwar nicht änderbar, aber Listen in einem Tuple können verändert werden.

Jedes Objekt hat eine eigene eindeutige id, die z.B. eine Rolle spielt bei Vergleichen.
Die id ändert sich nie während der „Lebenszeit“ eines Objekts. Dieselben Objekte haben dieselbe id.
Aufpassen beim Objektvergleich:
a == b verwendet die implementierte Methode __eq__ für den Vergleich.
a is c verwendet die id für den Vergleich

Wann wird ein Objekt entfernt aus dem Memory?
Wenn ein Objekt gelöscht wird, dann wird die implementierte Methode __del__ aufgerufen.

Ein Objekt wird aus dem Speicher entfernt, wenn das reference counting = 0 ist, oder der garbage collector aufgerufen wird. Der GC stellt fest, ob Objekte zyklisch isoliert sind, also gegenseitig referenziert sind, dann werden die Referenzen entfernt, und die Objekte aus dem Speicher gelöscht.
Der GC „beobachtet“ keine Strings, weil sie keine Pointer enthalten können.

In „Personal growth and the Python community“ (von Yashasvi Misra) erzählt und berichtet die Referntin von ihren Erlebnissen und dem persönlichen Fortgang, wie sie sich in und mit Python weiterentwickelt hat.
Im Allgemeinen startet man mit einem Thema, in dem man sich Gleichgesinnte sucht, und vor allem Interesse und Wille hat, etwas zu lernen, sowie Wissen zu teilen.
Speziell in Python können folgende Schritte sinnvoll sein:
Aufgabe suchen, und anfangen zu programmieren.
Unterstützung finden durch erfahrene Pythonistas.
Kommunikationsfähigkeiten verbessern durch Beiträge, Vorträge und Veröffentlichungen
Wenn Zweifel kommen, ist eine Community wichtig, die hilft und unterstützt, und damit Zweifel zerstreut.

Nutzen einer Community

  • Lernen! Wachsen! Weiterentwickeln! (Learn! Grow! Evolve!)
  • unterstützendes Umfeld, das unvoreingenommen und sehr umfassend ist
  • Netzwerk mit potentiellen Arbeitsgebern

Auswirkungen einer Community

  • Verbesserung der kommunikativen und technischen Fähigkeiten
  • Zusammenarbeit mit Leuten aus aller Welt, in vielen Events and Projekten
  • große Menge von Wissen, das geteilt wird

Wie und wo soll ich anfangen?
Erkunde Communities, denen Du beitreten möchtest.
Trete den Communities Channels bei.
Ergreife die Initiative, spreche mit den Leuten.
Nehme Kontakt zu den Organisatoren der Gemeinschaft auf.
Vernetze Dich mit anderen Menschen in der Community (finde Mentoren und Mitstreiter).
Arbeite bei Veranstaltungen und Projekten mit.

Fazit
Auch dieser Tag hat sinnvolle Punkte wieder in Erinnerung gerufen, so wie neue Erkenntnisse gebracht.
Leider ist ein zumindest von der Vorankündigung her interessanter Vortrag ausgefallen. Da es aber drei intensive Tage waren, konnte ich diesen Ausfall verschmerzen. Außerdem gibt es noch ein, zwei Vorträge, die zwischendurch parallel liefen, und die ich mir im Nachhinein noch anhören werde. Die Veranstaltung ist also noch nicht endgültig beendet für mich.
Die Einstufung der einzelnen Vorträge für beginner oder intermediate passten sehr gut. Ich habe mich an die beginner Vorträge gehalten. Zwar hatte ich bereits einige Vorkenntnisse, das war aber kein Nachteil, und führte nicht zur Langeweile, ganz im Gegenteil. Da Python sehr viele unterschiedliche Einsatzmöglichkeiten bietet, ist oft eine kleine Wiederholung und ein Auffrischen des bereits Bekannten nicht verkehrt.
Die Veranstaltung hat sich für mich gelohnt, sie war den Zeit- und Energieaufwand wert. Ich konnte allen Vorträgen folgen, sie haben das Interesse geweckt, mal ein „richtiges“ Projekt mit Python zu realisieren.