Git Product home page Git Product logo

pynrw's Introduction

pynrw

pre-commit.ci status pylint status test status CodeQL PyPI - Version Python versions semantic-release PyPI - Format License: MIT Ruff Style: black Imports: isort

This package implements the datastructures, database and network classes given by the German state NRW in Python, thus futher documentation will be in German. This code is purely intended for educational purposes and should not be used in production!

Dieses Package dient alleine zu Bildungszwecken und sollte nicht in Produktion genutzt werden!

Installation

pip install pynrw

Alternativ:

pip install git+https://github.com/realshouzy/pynrw

Beispiel

from nrw.algorithms import quick_sort
from nrw.datastructures import List

lst: List[int] = List()

for i in range(0, 10, -1):
  lst.append(i)

print(lst.content)  # None
lst.to_first()
print(lst.content)  # 9
print(lst)  # List(9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0)

sorted_lst: List[int] = quick_sort(lst)
sorted_lst.to_first()
print(sorted_lst.content)  # 0
print(sorted_lst)  # List(0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9)

Dokumentation

Datenstrukturen

Dieses Package implementiert die Datenstrukturen nach den Vorgaben des Landes NRW in Python, zu finden in nrw.datastructures, d.s.:

Die Implementation ist semantisch identisch zu der Implementation des Landes mit dem einzigen Unterschied, dass alles mehr pythonic ist, d. h. die Benennung der Methoden folgt pep8, Getter und Setter sind, wo es sinnvoll ist, in properties transformiert und die Dokumentation (doc strings) sind ebenfalls angepasst worden.

Das Interface ComparableContent ist ein gleichnamiges Protocol, definiert in nrw.datastructures._comparable_content. Es gibt die dunder special methods, __eq__, __lt__ und __gt__ für einfache Vergleichsoperationen vor. Das Module stellt auch ein TypeVar ComparableContentT zur Verfügung.

Außerdem implementieren die Datenstrukturen __str__, welches das Arbeiten mit diesen deutlich vereinfacht (besonders für Binary(Search)Tree) und __repr__, welches eine grobe Idee der internen Strukture gibt, z.B.:

from nrw.datastructures import BinarySearchTree

bst: BinarySearchTree[int] = BinarySearchTree()
bst.insert(3)
bst.insert(2)
bst.insert(5)
bst.insert(0)
bst.insert(1)
bst.insert(4)
print(bst)
#       3__
#      /   \
#   __2     5
#  /       /
# 0       4
#  \
#   1

Des weiteren sind (triviale) Optimierungen vorgenommen worden:

  • Verwendung von __slots__
  • redundante Aufrufe werden weggelassen
  • interne Optimierungen bei Zuweisungen

Algorithmen

Zusätzlich enthält dieses Package nützliche Funktionen zum Sortieren, Suchen und Traversiern, zu finden in nrw.algorithms:

Die verschiedenen Traversierungen unterstützen auch Umkehrung. Allerdings muss annotiert werden, dass aufgrund der Vorgaben des Landes die Laufzeiten nicht optimal sind. Zudem kann es zu ungewollten Nebeneffekte kommen. Welche dies sind, wird dem Leser als Übung überlassen.

Datenbankklassen

Analog zu den Datenstrukturen sind auch Datenbankklassen größtenteils semantisch identisch zur den Vorgaben des Landes. Die jeweiligen Klassen sind in nrw.database definiert:

Hierbei ist zu beachten, dass der DatabaseConnector für MSAccess den Microsoft Access Driver benötigt und passwortgeschützte Datenbanken nicht unterstüzt. Des weiteren gilt für QueryResult, dass die Daten und die Spaltentypen nicht unbedingt als String wiedergegeben werden. Die Daten werden als Python-Äquivalenten Datentypen wiedergegeben, und für die Spaltentypen gilt:

  • SQLite: immer None, da SQLite dynamisch typisiert ist
  • MySQL: die entsprechenden Datentypen von MySQL als String
  • MSAccess: die entsprechenden Datentypen (Klassen) von Python

Netzklassen

Die Netzklassen sind ebenfalls semantisch identisch zu den Netzklassen des Landes. Diese sind in nrw.network zu definiert:

Die letzteren beiden sind ABCs. Bei diesen weicht die interne Implementation von der Java Implementation des Landes ab, da deren Ansatz nicht eins-zu-eins in Python übertragen werden kann; somit ist der Quellcode für Fortgeschrittene, v.a. der Quellcode des Servers. Nichtsdestotrotz ist die Anwendung und der Funktionsumfang der Selbe wie vom Land.

Allgemein

Mir ist bewusst, dass manche Klassen wie QueryResult oder auch die Nodes sich besser als dataclasses eignen. Allerdings können die Docstrings so nicht für alle Methoden und Properties gesetzt werden.

Für mehr Information zu einem beliebigen Objekt kann help genutzt werden, z.B.:

from nrw.datastructures import List
help(List)
help(List.insert)

Es soll nicht vor einem Blick in den Quellcode zurückgeschreckt werden.

Motivation

Vereinfacht: Java, als Programmiersprache in der Bildung, ist eine schlechte Wahl, da ...

  • Java veraltet ist.
  • das rein objekt-orientierte Paradigma schlechthin unbrauchbar ist.
  • die Syntax und und die statische Typisierung für Anfänger einschränkend sein können.

Diese Probleme und Hürden werden größtenteils mit Python überwunden.

Unterstützung

Jegliche Form der Unterstützung ist willkommen. Für mehr Informationen referiere ich hierhin.

Quellen

pynrw's People

Contributors

pre-commit-ci[bot] avatar realshouzy avatar

Watchers

 avatar

pynrw's Issues

License incompatibility (accidental duplicate)

The current license of this project (MIT) is incompatible with CC BY-SA 4.0 (default for answers on StackOverflow), so I have removed the offending code and replaced it with a permissively-licensed alternative or remove it.
Feel free to suggest an alternative, if someone knows one.

License incompatibility

The current license of this project (MIT) is incompatible with CC BY-SA 4.0 (default for answers on StackOverflow), so I have to remove the offending code or replace it with a permissively-licensed alternative if available.
Feel free to suggest an alternative, if someone knows one.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.