Seite 1 von 1

Marlems PyAssistent

Verfasst: Freitag 30. Oktober 2020, 04:02
von PythonMarlem
Hallo,

mein erstes Python-Programm gibt es zum kostenlosen Download.
Marlems PyAssistent ist vom Prinzip her ein Sprachassistent wie Siri, Google Assistent und Cortana. Allerdings werden Kommandos nicht gesprochen, sondern per Tastatur eingegeben. Antworten erfolgen nicht per Sprachausgabe, sondern per Text. Der Vorteil ist, Marlems PyAssistent ist auch für Nutzer die nicht sprechen können oder gehörlos sind einsetzbar. Marlems PyAssistent hat eine ausführliche Hilfe. Das Programm wurde auf folgenden Betriebssystemen erfolgreich getestet:
Windows 10
Ubuntu 20.04
MacOS 10.15
Marlems PyAssistent kann 200 Kommandos.

Quelle: https://www.marlem-software.de/download ... honconsole

So, jetzt der eigentliche Grund warum ich zurückkehre!

Marlems PyAssistent wurde auf heise.de vorgestellt:
https://www.heise.de/news/Barrierefreie ... 40192.html

Leute, ich entwickle Software seit 1996. Noch nie wurde ein Programm von mir auf heise.de vorgestellt.
Ich bin Gigastolz!

Re: Marlems PyAssistent

Verfasst: Freitag 30. Oktober 2020, 09:24
von __deets__
Herzlichen Glückwunsch!

Re: Marlems PyAssistent

Verfasst: Freitag 30. Oktober 2020, 10:44
von Sirius3
@PythonMarlem: alle Zeilenumbruchsverhinderungszeichen sind überflüssig. Sie machen eh nur mehr Probleme, als dass sie lösen.
Variablennamen und Funktionsnamen schreibt man komplett klein.
In mainmenu benutzt Du Rekursion statt einer Schleife. Was um so schlimmer ist, da Du die Datei, die Du da öffnest nicht wieder schließt und damit immer mehr Dateihandles verbrätst, bis das Betriebssystem keine Lust mehr.
In `barrierefreiheitbetriebssystem` benutzt man statt Popen und wait einfach run. Da Du die Ausgabe in Pipes umleitest, diese aber nicht ausliest, können die Pipes irgendwann voll sein, und dann stehen beide Programme, das eine Wartet darauf, dass wieder Platz in der Pipe ist und das andere, dass es endlich zu Ende ist.
In `kommandoszuthemenanzeigen` rufst Du sorted auf, ohne etwas mit dem Rückgabewert zu tun, das ist sinnlos.
Warum wird aus Themen plötzlich nur ein Thema, nur indem man den Leerraum entfernt?
In `rechne` benutzt Du globale Variablen. Was soll denn das v in vzahl bedeuten? Ist das eine Vertrauenszahl, die andere Zahlen ausspioniert?
Die vielen Replace-Ketten würde man mit einer Schleife kürzer schreiben.
Die if-Abfrage mit rechenaufgabeformat ist doch total überflüssig, da Du immer Leerzeichen um Rechenoperationen einfügen könntest. split sollte normalerweise ohne Argument aufgerufen werden, damit auch anderer Leerraum, als exakt ein Leerzeichen erkannt werden.
rechenaufgabearray ist dann kein Array sondern eine Liste. Datentypen haben in Namen aber eh nichts verloren.
Oh, noch mehr Vertrauensvariablen. Nach einem Fehler machst Du so weiter, als ob nichts passiert wäre. Das führt zu Folgefehlern und sehr seltsamen Ausgaben.
Bei den vrechenoperator-Blöcken verstehe ich nicht, wie dort ein ValueError auftreten sollte und warum das etwas mit der Meldung zu tun hat, die dann kommt. Das kann alles weg. Die vielen if-Blöcke würde man durch ein Wörterbuch ersetzen.

Code: Alles auswählen

import operator
ZAHLEN = {
    "null": "0",
    "eins": "1",
    "zwei": "2",
    "drei": "3",
    "vier": "4",
    "fünf": "5",
    "sechs": "6",
    "sieben": "7",
    "acht": "8",
    "neun": "9",
    "zehn": "10",
}
OPERATIONEN = {
    "+": operator.add,
    "-": operator.sub,
    ":": operator.div,
    "/": operator.div,
    "*": operator.mul,
    "x": operator.mul,
    "X": operator.mul,
}

def rechne(rechenaufgabe):
    """rechnet +*/- """
    for wort, zahl in ZAHLEN.items():
        rechenaufgabe = rechenaufgabe.replace(wort, zahl)
    for operator in OPERATIONEN:
        rechenaufgabe = rechenaufgabe.replace(operator, " {operator} ")
    teile = rechenaufgabe.split()
    if len(teile) != 3:
        print("Geben sie eine Rechnung mit zwei Operanden ein! Richtig: 1 + 1 ")

    try:
        zahl1 = float(teile[0])
    except ValueError:
        print("Keine Zahl eingegeben!")
        return
    try:
        zahl2 = float(teile[2])
    except ValueError:
        print("Keine Zahl eingegeben!")
        return
    try:
        operation = OPERATIONEN[teile[1]]
    except KeyError:
        print("Keine bekannte Rechenoperation")
        return

    ergebnis = operation(zahl1, zahl2)
    antwort(f"{rechenaufgabe} = {ergebnis}", "text")
In `rechneProzent` hast Du quasi den selben Code wie in `rechne`, nur dass Du jetzt einen Programmierfehler drin hast, weil Du rechenaufgabe nicht konisistent in vrechenaufgabe umbenannt hast. `vrechenaufgabearray` wird mit einer leeren Liste belegt, aber dann gleich wieder überschrieben.

Strings setzt man nicht mit + zusammen, sondern benutzt Formatstrings.
In `dasoertliche` ist es noch schlimmer, denn dort werden Usereingaben einfach so in eine URL hineingestückelt. Für URLs müssen Parameter aber passend kodiert werden (urllib.parse.quote).
In `einfachunterhalten` würde man statt der langen if-Kette einfach ein Wörterbuch benutzen. Die erste Frage kann nie gestellt werden, weil es einen Großbuchstaben gibt.
Zu `clear`: os.system ist veraltet.
In `programmezumausfuehrenhinzufuegen` schreibst Du in eine Datei, die noch zum Lesen geöffnet ist. In den beiden if-Blöcken ist auch viel doppelter Code. Man prüft nicht explizit auf True.
Die Funktion `existiertdatei` ist auch süß. Eine Funktion, die prüft ob eine Datei existiert und einen Text ausgibt. Die Ausgabe gehört eigentlich dort hin, wo die Funktion aufgerufen wird.
In `witzeerzaehlen` sollte alles wieder in einem Wörterbuch gespeichert sein.
In `scheresteinpapier` hast Du eine Variable spielen, die nie geändert wird. Und wieder zu viel kopierter Code.
`Tic Tac Toe` benutzt globale Variablen, statt das feld sauber per Argument zu übergeben.
Bei `Vier Gewinnt` genauso.
`hangman` benutzt wieder Rekursion statt einer Schleife.
Die ganzen vokabeltrainer-Funktionen sind identisch und sollten nur eine Funktion sein.

Du benutzt pathlib.Path sehr seltsam, weil Du trotzdem alles mit os.path machst, was veraltet ist.
In `pyassistent` hast Du sehr viel kopierten Code. Warum hast Du nochmal alle Fragen von einfachunterhalten wiederholt?

2000 Zeilen ungetesteter Code sind zu viel für eine Datei.

Re: Marlems PyAssistent

Verfasst: Sonntag 1. November 2020, 20:29
von rennmaus
Wow! Herzlichen Glückwunsch, vielleicht schaue ich es mir auch mal an

Re: Marlems PyAssistent

Verfasst: Donnerstag 5. November 2020, 14:55
von __blackjack__
Das Programm hat es auf Heise geschafft: https://www.heise.de/news/Barrierefreie ... 40192.html

Re: Marlems PyAssistent

Verfasst: Donnerstag 5. November 2020, 15:51
von einfachTobi
@__blackjack__
PythonMarlem hat geschrieben: Freitag 30. Oktober 2020, 04:02 (...)
Marlems PyAssistent wurde auf heise.de vorgestellt:
https://www.heise.de/news/Barrierefreie ... 40192.html

Leute, ich entwickle Software seit 1996. Noch nie wurde ein Programm von mir auf heise.de vorgestellt.
Ich bin Gigastolz!
@PythonMarlem: Schönes Projekt - Glückwunsch.

Re: Marlems PyAssistent

Verfasst: Donnerstag 5. November 2020, 16:54
von __blackjack__
Ups, glatt überlesen.

Ich seh's ja eher skeptisch. Von einem IT-Unternehmen erwarte ich etwas mehr als so ein Anfängerskript. Einen Anfänger kann man dafür beglückwünschen, jemand der angeblich seit über 20 Jahren Software entwickelt, sollte etwas handwerklich besseres liefern können.

Re: Marlems PyAssistent

Verfasst: Dienstag 10. November 2020, 18:35
von PythonMarlem
Danke für die Glückwünsche.
Heute wird es auf entwickler.de vorgestellt:
https://entwickler.de/online/python/mar ... 48463.html

Re: Marlems PyAssistent

Verfasst: Dienstag 10. November 2020, 18:57
von snafu
Das Thema ist wichtig, aber die Umsetzung lässt noch Luft nach oben (nichts für ungut). Vielleicht tust du dich mal mit jemandem zusammen, der viel Programmier-Erfahrung hat in Kombination mit deinem Fachwissen. Wäre eine gute Möglichkeit, das Projekt für die nächsten Jahre weiterlaufen zu lassen. Aber klar, es ist dein Ding und du bestimmst, wohin die Reise geht... ;)