Bitte um Vorschläge, wie man mit Python eine Datei anpassen kann.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

Sirius3 hat geschrieben: Mittwoch 3. Juli 2024, 16:17 @RIN67630: wie man das macht hab ich ja schon gepostet. `replace` funktioniert auch mit Bytes.
Gut, ich werde mal morgen folgendes probieren:

Code: Alles auswählen

from pathlib import Path

# define placeholder WLANSSID 
PWLANSSID = "WLANSSID".ljust(17, b"\0")

#get filename to patch
binfile = input ("Enter binfile to patch:")
data_file = Path.home().joinpath("Desktop", binfile)

file.open("data_file") as file_to_patch:

#get user WLANSSID
UWLANSSID = input("Enter SSID:")
UWLANSSID .ljust(17, b"\0")

content_patched  = file_to_patch.replace (PWLANSSID, UWLANSSID)
file_to_patch.write(content_patched)

print(" Your file has been successfully patched")
Das erstmal als Funktionstest, später werden Plausibilitätsprüfungen und weitere Variablen hinzukommen.

Ist es so OK?

Danke für die Beratung.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist einfach nur geraten und nicht programmiert. Strings und Bytes kann man nicht kombinieren. Man muß die Strings erst nach Bytes encodieren.
Warum muß Deine Datei unter $HOME/Desktop liegen?
Es fehlt das "with" beim with-Block. `file` ist nicht definiert. Der String "data_file" macht keinen Sinn.
Einfach nur einen String mit 0en zu füllen, das Ergebnis dann aber gleich wieder wegzuwerfen, ist nicht sinnvoll. Man muß das Ergebnis auch einer Variable zuweisen. Außerdem mußt Du prüfen, ob die Eingabe nicht schon mehr als 17 Zeichen enthalten hat.
Ein File-Objekt kennt kein replace. Du mußt erst den Inhalt der Datei lesen und denn dann verändern. Dazu muß die Datei im Binärmodus geöffnet werden. Einfacher geht es mit read_bytes.
Am einfachsten schreibt man den Inhalt auch mit data_file.write_bytes zurück.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

Sirius3 hat geschrieben: Mittwoch 3. Juli 2024, 19:29 Das ist einfach nur geraten und nicht programmiert. Strings und Bytes kann man nicht kombinieren. Man muß die Strings erst nach Bytes encodieren.
Warum muß Deine Datei unter $HOME/Desktop liegen?
Es fehlt das "with" beim with-Block. `file` ist nicht definiert. Der String "data_file" macht keinen Sinn.
Einfach nur einen String mit 0en zu füllen, das Ergebnis dann aber gleich wieder wegzuwerfen, ist nicht sinnvoll. Man muß das Ergebnis auch einer Variable zuweisen. Außerdem mußt Du prüfen, ob die Eingabe nicht schon mehr als 17 Zeichen enthalten hat.
Ein File-Objekt kennt kein replace. Du mußt erst den Inhalt der Datei lesen und denn dann verändern. Dazu muß die Datei im Binärmodus geöffnet werden. Einfacher geht es mit read_bytes.
Am einfachsten schreibt man den Inhalt auch mit data_file.write_bytes zurück.
Danke für den Rüffel. Ich habe alles falsch. So kann ich mir den Test sparen.
Wie wäre es mit einem Beispiel, wie man es richtig macht?
Warum muß Deine Datei unter $HOME/Desktop liegen?
Muss nicht, es macht es nur einfacher, dem Anwender zu erklären, er soll die Datei dort herunterladen.
Ginge genauso mit $HOME/Downloads
Das sind Verzeichnisse, die es beim Anwender fast immer gibt.
Außerdem mußt Du prüfen, ob die Eingabe nicht schon mehr als 17 Zeichen enthalten hat.
Klar. das kommt hinterher, wenn mal die Syntax verdaut ist.

Schöne Grüße
Laszlo
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@RIN67630: Ich habe den Eindruck Du verwendest den Begriff ”Syntax” für mehr als der eigentlich bedeutet. Wobei die beiden Syntaxfehler, also das fehlende ``with`` und die fehlende Einrückung im Grundlagentutorial in der Python-Dokumentation behandelt werden.

Wie wäre es wenn Du Python lernst? Dieses ewige fragen nach einem ”Beispiel” meint ja eigentlich, das Du so lange nachfragst bis jemand das Programm für Dich geschrieben hat, statt Dich mal ernsthaft selbst damit auseinanderzusetzen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

__blackjack__ hat geschrieben: Mittwoch 3. Juli 2024, 22:13 @RIN67630: Ich habe den Eindruck Du verwendest den Begriff ”Syntax” für mehr als der eigentlich bedeutet. Wobei die beiden Syntaxfehler, also das fehlende ``with`` und die fehlende Einrückung im Grundlagentutorial in der Python-Dokumentation behandelt werden.

Wie wäre es wenn Du Python lernst? Dieses ewige fragen nach einem ”Beispiel” meint ja eigentlich, das Du so lange nachfragst bis jemand das Programm für Dich geschrieben hat, statt Dich mal ernsthaft selbst damit auseinanderzusetzen.
Ich werde nicht widersprechen.
Ja, ich komme von c++ und will auch so schnell wie möglich wieder dorthin.
Aber wenn ein Python Programmierer zu mir käme und mich um Hilfe bei einem C++ Codeschnipsel bitten würde, dann würde ich ihn helfen und ihm nicht empfehlen C++ zu lernen.

Und ja, die wichtige Einrückung hatte ich ganz vergessen, Asche über mein Haupt. Das zeigt ja, wo ich mich mit Python befinde.

Der Weg von fast Null bis zu Bewältigung von Aufgaben wie die Manipulation von Strings und Char arrays lässt sich sicher nicht so leicht im Grundlagentutorial in der Python-Dokumentation ablesen. Da gibt es eine Menge Stolpersteine, die mir erspart werden könnten.
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Python-Shell hat eine help()-Funktion. Damit kannst du dir zu einem beliebigen Objekt die passende Dokumentation anzeigen lassen. So zeigt dir z. B. ein help(str) alles, was man mit Strings machen kann. Anfangs kommen die Dunder-Methoden, also Methoden mit doppelten Unterstrichen, danach die spannenderen Teile.
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

Schreib das Programm doch in C++?

Wenn du das Programm da lösen kannst, dann wirkt der Aufwand Für mich sehr groß, denndu treibst, um es in Python zu lösen.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

sparrow hat geschrieben: Donnerstag 4. Juli 2024, 05:13Schreib das Programm doch in C++?
Ich habe ja zu Beginn meiner Anfrage erklärt, dass ich es nicht für mich selbst benötige, sondern um meinen Benutzern das Kompilieren zu ersparen.
Das Upload-Programm für ESP-Mikrocontroller ist ein Python-Skript, daher ist es sinnvoll, das Skript so anzupassen, dass es vor dem Hochladen lediglich die Bin-Datei patcht.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

snafu hat geschrieben: Donnerstag 4. Juli 2024, 04:16 ...eine help()-Funktion...Anfangs kommen die ... Methoden mit doppelten Unterstrichen, danach die spannenderen Teile.
Sirius3 hat mich mit dem entschiedenend Beispiel "raw_value .ljust(length, b"\0")" soweit gebracht. Ihm gilt mein Dank!
Doch dann wurde ich wieder ins Dunkel zurückgeworfen mit "Du kannst Strings und Bytes nicht kombinieren. Du musst die Strings erst nach den Bytes kodieren."
Welche Methode liefert (bzw. erwartet) Strings und welche Bytes? Für Außenstehende nicht ganz einfach...
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@RIN67630: Wann Dateiobjekte Zeichenketten liefern und erwarten und wann Bytes steht im Grundlagentutorial in der Python-Dokumentation. Das ist wenn man über die Antwort nachdenkt auch ziemlich logisch.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

__blackjack__ hat geschrieben: Donnerstag 4. Juli 2024, 08:30 @RIN67630: Wann Dateiobjekte Zeichenketten liefern und erwarten und wann Bytes steht im Grundlagentutorial in der Python-Dokumentation. Das ist wenn man über die Antwort nachdenkt auch ziemlich logisch.
Ich mache den Fehler, es meine Anwendern mit dem Patcher leicht machen zu wollen.
Ist ja alles in Grundlagentutorials beschrieben.
Danke für die Lektion.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1224
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Du könntest das Programm auch in C/C++ schreiben, wenn du diese Sprache besser beherrscht. Also ich würde nicht darüber lange nachdenken.

Wenn du es deinen Anwendern einfach machen möchtest, dann sollte der Anwender bei der Inbetriebnahme alle Daten über den AP des ESP32 selbständig einrichten können und es sollte nicht vom Flashen abhängig sein.

Die Logik, die dazu notwendig ist, kannst du dann auch in C/C++ umsetzen und alle Funktionen dafür bietet das SDK des ESP32. In der Regel melden sich solche Geräte mit ihrem eigenen Hotspot, wenn sie keine Verbindung zustande bekommen. So kann man auch mal den Router wechseln und ist als Kunde dann nicht drauf angewiesen, die Firmware nochmal zu flashen. Gespeichert können die Daten im NVS (Non-volatile Storage) und der NVS befindet sich in einer der Partitionen. Ach für NVS stellt das SDK entsprechende Funktionen zur Verfügung.

Wenn es darum geht, Daten zu verstecken, vergiss es. Jemand, der aus dem Image die SSID und Passwort extrahieren will, kann das einfach mit dem esptool machen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

DeaD_EyE hat geschrieben: Donnerstag 4. Juli 2024, 14:31 Wenn du es deinen Anwendern einfach machen möchtest, dann sollte der Anwender bei der Inbetriebnahme alle Daten über den AP des ESP32 selbständig einrichten können
Dies ist die klassische Methode, die allerdings eine Menge Nachteile mit sich bringt:
1) es erfordert viel Code im kleinen ESP 8266 Mikrocontroller, der bei mir ohnehin schon vollgestopft ist: Der gesamte HTML-Inhalt muss als Text im Programm definiert, dann die Daten im EEPROM gespeichert werden, und beim Booten daraus abgerufen.
2) die Bibliotheken dafür berücksichtigen nur die WLAN-Daten, nicht die erforderliche Cloud Credentials.
3) es ist auch umständlich für den Benutzer.

Die Abfrage der Credentials und das Patchen direkt vor dem Hochladen in Python erledigt alles in einem Rutsch.
Das ist deutlich eleganter, schlanker und man muss nichts extra im C++ Code des ESP8266 dafür programmieren.
Das EEPROM kann folglich für mehr Programminhalte genutzt werden.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum benutzt Du die schön sprechenden Namen aus deiner C-Datei nicht auch in Python? Warum wird aus DEVICE_NAME PDEVCNAME?
Definiere Deine Strings gleich als Bytes, dann mußt Du sie nicht extra umwandeln.
`infile` sollte möglichst schnell in einen Pfad umgewandelt werden, weil Du dann nicht auf Stringebene den Pfad manipulieren mußt.
Würdest Du gleich Funktionen statt Kommentare zur Strukturierung Deines Programms benutzen, wäre es viel leichter zu warten.
Dateien öffnet man mit dem with-Statement, oder benutzt gleich read_bytes.
Die Länge prüft man besser nach der Umwandlung nach Bytes,, weil man sonst leicht Fehler macht. Und da Du insgesammt 5 Variablen abfrägst, wäre das ein guter Grund, dafür eine Funktion zu schreiben.
Wenn man jetzt noch eine Schleife, statt 5 mal den selben Code benutzt, wird daraus ein kompaktes Programm:

Code: Alles auswählen

from pathlib import Path

PLACEHOLDERS = [
    ("SSID", b"WIFISSID        "),
    ("Password", b"WIFIPASS                "),
    ("Device Name", b"DEVCNAME        "),
    ("Cloud User Name", b"CLOUDNAM        "),
    ("Device Credentials", b"DEVCCRED        "),
]

def get_filenames():
    infile = input("Enter binfile to patch:")
    infile_path  = Path.home() / "Desktop" / infile
    if infile_path.suffix != ".bin":
        raise Exception("Filename must end with .bin")
    outfile_path = infile_path.with_stem(infile_path.stem + "_patched")
    return infile_path, outfile_path

def input_value(name, placeholder):
    value = input(f"Enter {name}:")
    if not value.isascii():
        raise Exception("Unicode not supported")
    value = value.encode().ljust(len(placeholder), b"\0")
    if len(value) > len(placeholder):
        raise Exception("Input too long")
    return value

def main():
    infile_path, outfile_path = get_filenames()
    original_content = infile_path.read_bytes()

    content = original_content
    for name, placeholder in PLACEHOLDERS:
        value = input_value(name, placeholder)
        content  = content.replace(placeholder, value)
     
    assert len(content) != len(original_content), "Something went wrong, patched file length different")

    outfile_path.write_bytes(content)
    print (f"File {outfile.name} saved")

if __name__ == "__main__":
    main()
Benutzeravatar
pillmuncher
User
Beiträge: 1529
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

RIN67630 hat geschrieben: Freitag 5. Juli 2024, 21:06 Das Program ist fertig.
Deine Einrückung ist kaputt:

Code: Alles auswählen

  File "/home/mick/Source/python/patch/patch.py", line 10
    PDEVCNAME = "DEVCNAME        "
IndentationError: unexpected indent
Außerdem fragst du zwar das Passwort ab, verwendest es dann aber nicht, weil du beim copy-and-paste einen Fehler gemacht hast.

Den Unicode Encoding Error brauchst du auch nicht selbst auszulösen, weil Python das schon für dich macht, wenn du versuchst, einen in ASCII nicht darstellbaren String als ASCII zu encoden.

Ich hab es mal aufgeräumt und ent-crypted:

Code: Alles auswählen

from pathlib import Path


def get_padded_ascii_intput(prompt, max_len):
    value = input(prompt)
    if len(value) > max_len:
        raise ValueError("Input too long")
    return value.encode("ascii").ljust(max_len, b"\0")


def main():
    # Original Paceholder defines in C++ code
    # define DEVICE_NAME          "DEVCNAME        "
    # define WIFI_SSID            "WIFISSID        "
    # define WIFI_PASS            "WIFIPASS                "
    # define THINGER_USERNAME     "CLOUDNAM        "
    # define DEVICE_CREDENTIALS   "DEVCCRED        "

    ssid               = b"WIFISSID        "
    wifi_password      = b"WIFIPASS                "
    device_name        = b"DEVCNAME        "
    cloud_username     = b"CLOUDNAM        "
    device_credentials = b"DEVCCRED        "

    infile_name = Path(input("Enter binfile to patch: "))
    if infile_name.suffix != ".bin":
        raise Exception("Filename must end with .bin")
    outfile_name = f"{infile_name.stem}_patched.bin"
    infile_path = Path.home() / "Desktop" / infile_name
    outfile_path = Path.home() / "Desktop" / outfile_name

    with open(infile_path, "rb") as f:
        content_to_patch = f.read()

    content_patched = (
        content_to_patch.replace(
            ssid,
            get_padded_ascii_intput(
                prompt="Enter SSID: ",
                max_len=len(ssid),
            ),
        )
        .replace(
            wifi_password,
            get_padded_ascii_intput(
                prompt="Enter Password: ",
                max_len=len(wifi_password),
            ),
        )
        .replace(
            device_name,
            get_padded_ascii_intput(
                prompt="Enter Device Name: ",
                max_len=len(device_name),
            ),
        )
        .replace(
            cloud_username,
            get_padded_ascii_intput(
                prompt="Enter Cloud User Name: ",
                max_len=len(cloud_username),
            ),
        )
        .replace(
            device_credentials,
            get_padded_ascii_intput(
                prompt="Enter Device Credentials: ",
                max_len=len(device_credentials),
            ),
        )
    )

    if len(content_patched) != len(content_to_patch):
        raise ValueError("Something went wrong, patched file length different")

    with open(outfile_path, "wb") as f:
        f.write(content_patched)

    print(f"File {outfilename} saved.")


if __name__ == "__main__":
    main()
In specifications, Murphy's Law supersedes Ohm's.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

Sirius3 hat geschrieben: Freitag 5. Juli 2024, 23:03 Warum benutzt Du die schön sprechenden Namen aus deiner C-Datei nicht auch in Python? Warum wird aus DEVICE_NAME PDEVCNAME?
Das Prefix P stand für Placeholder, U für User, C für ASCII
Ich hatte mich auch nicht getraut, nach der ASCII Konvertierung ins String zurückzuschreiben. Anscheinend schluckt Python das ohne zu murren.
Ich habe jetzt schönere, lesbaren Variablen definiert.
...Und da Du insgesammt 5 Variablen abfrägst, wäre das ein guter Grund, dafür eine Funktion zu schreiben.
Wenn man jetzt noch eine Schleife, statt 5 mal den selben Code benutzt, wird daraus ein kompaktes Programm:
Typisch Python-Programmierer Reflexe !
Erstmal alle Kommentare heraus, dann möglichst ins insider-Kauderwelsch umwandeln, dass es kompakt wird, gelle?
;-)
In dem Fall muss es weder performant, noch objektorientiert sein.
Es läuft einmal durch und fertig.
Ich lasse es lieber so wie Normalspache linear aussehen, dass es auch Aussenstehende intuitiv verstehen und bei Bedarf anpassen können.

Code: Alles auswählen

from pathlib import Path
# Original Paceholder defines in C++ code
#define DEVICE_NAME          "DEVCNAME        "
#define WIFI_SSID            "WIFISSID        "
#define WIFI_PASS            "WIFIPASS                "
#define THINGER_USERNAME     "CLOUDNAM        "
#define DEVICE_CREDENTIALS   "DEVCCRED        "  
     
# define the same placeholders in Python
Placeholder_DEVCNAME = b"DEVCNAME        "
Placeholder_WIFISSID = b"WIFISSID        "
Placeholder_WIFIPASS = b"WIFIPASS                "
Placeholder_CLOUDNAM = b"CLOUDNAM        "
Placeholder_CLOUDNAM = b"DEVCCRED        "  
     
#get filename to patch
infile = input ("Enter binfile to patch:")
if not infile.endswith(".bin"):
    raise Exception("Filename must end with .bin")
else:
    outfile = infile.replace(".bin", "_patched.bin")
    infile_path  = Path.home().joinpath("Desktop", infile)
    outfile_path = Path.home().joinpath("Desktop", outfile)
     
# read file
f= open(infile_path, 'rb')
content_to_patch = f.read()
f.close()
     
#get user WIFISSID
User_WIFISSID = input("Enter SSID:")
if len(User_WIFISSID) > len(Placeholder_WIFISSID):
    raise Exception("Input too long")
     
# convert that String to ascii bytes
User_WIFISSID = User_WIFISSID.encode("ascii")
#fill data to become exactly the length of the placeholders.
User_WIFISSID = User_WIFISSID.ljust(len(Placeholder_WIFISSID), b"\0")
     
content_patched  = content_to_patch.replace (Placeholder_WIFISSID, User_WIFISSID)
     
#get user WIFIPASS
User_WIFIPASS = input("Enter Password:")
if len(User_WIFIPASS) > len(Placeholder_WIFIPASS):
    raise Exception("Input too long")
     
# convert that String to ascii bytes
User_WIFIPASS = User_WIFIPASS.encode("ascii")
#fill data to become exactly the length of the placeholders.
User_WIFIPASS = User_WIFIPASS.ljust(len(Placeholder_WIFIPASS), b"\0")
     
content_patched  = content_patched.replace (Placeholder_WIFIPASS, User_WIFIPASS)
      
#get user DVCNAME
User_DEVCNAME = input("Enter Device Name:")
if len(User_DEVCNAME) > len(Placeholder_DEVCNAME):
    raise Exception("Input too long")
     
# convert that String to ascii bytes
User_DEVCNAME = User_DEVCNAME.encode("ascii")
#fill data to become exactly the length of the placeholders.
User_DEVCNAME = User_DEVCNAME.ljust(len(Placeholder_DEVCNAME), b"\0")
     
content_patched  = content_patched.replace (Placeholder_DEVCNAME, User_DEVCNAME)
     
#get user CLOUDNAM
User_CLOUDNAM = input("Enter Cloud User Name:")
if len(User_CLOUDNAM) > len(Placeholder_CLOUDNAM):
    raise Exception("Input too long")
     
# convert that String to ascii bytes
User_CLOUDNAM = User_CLOUDNAM.encode("ascii")
#fill data to become exactly the length of the placeholders.
User_CLOUDNAM = User_CLOUDNAM.ljust(len(Placeholder_CLOUDNAM), b"\0")
     
content_patched  = content_patched.replace (Placeholder_CLOUDNAM, User_CLOUDNAM)
     
#get user DEVCCRED
User_DEVCCRED = input("Enter Device Credentials:")
if len(User_DEVCCRED) > len(Placeholder_CLOUDNAM):
    raise Exception("Input too long")
     
# convert that String to ascii bytes
User_DEVCCRED = User_DEVCCRED.encode("ascii")
#fill data to become exactly the length of the placeholders.
User_DEVCCRED = User_DEVCCRED.ljust(len(Placeholder_CLOUDNAM), b"\0")
     
content_patched  = content_patched.replace (Placeholder_CLOUDNAM, User_DEVCCRED)
     
assert len(content_patched)  == len(content_to_patch), "Something went wrong, patched file length different"
# write back the patched content.
f = open(outfile_path, 'wb')
f.write(content_patched)
f.close()
     
print (f"File {outfile} saved")
Danke für den Input.
Laszlo

P.S. Deine Version hat noch ein Bug gegen das Ende des codes:

Code: Alles auswählen

assert len(content) != len(original_content), "Something went wrong, patched file length different")
soll sein:

Code: Alles auswählen

assert len(content) == len(original_content), "Something went wrong, patched file length different")
Zuletzt geändert von RIN67630 am Samstag 6. Juli 2024, 06:18, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

Typischer Kritik-Reflex ! [sic!]
Die Inhalte der Kritik ignorieren und möglichst auf kaputter Meinung beharren, gelle? ;)

Es geht nicht darum, dass der Code kompakter wird. Es geht darum, dass man etwas falsch macht, wenn man Code per Copy&Paste vervielfältigt. Und das in jeder Programmiersprache. Das ist nicht nur schlechtes Handwerk sondern auch fehleranfällg - Wie du vielleicht gemerkt hast, als du pillmuchers Antwort gelesen hast.

Und wie du jetzt auf Objektorierung kommst, nur weil jemand eine Funktion geschrieben hat, die den sich ständig wiederholenden Code kapseln, erschließt sich mir nicht.
RIN67630
User
Beiträge: 141
Registriert: Sonntag 29. April 2018, 08:07

Ich bin ein Noob und schreibe mein Code ebenso für Noobs.
Es geht nicht darum ein Python-Schönheitswettbewerb zu gewinnen.
Ein Noob wie ich muss es gleich verstehen und für sich anpassen können, auch wenn vielleicht z.B. das 4.oder 6. Parameter anders aussehen würde (eine Zahl etwa), was in einer Schleife richtig blöd wäre.

Und mit Verlaub, als ich hier gefragt habe, wollte mir keiner die richtigen Tipps geben, ich solle doch stattdessen stets die Tutorials lesen.
Jetzt als ich es genauso getan habe und das Programm auch funktioniert, kommt Ihr mit Euren Lösungen.
Warum nicht gleich? es hätte vielleicht anders ausgesehen.

Aber so wie es ist: linear, verständlich für Aussenstehende, kommentiert, wird es auch bleiben, auch wenn's nicht dem Mainstream passt.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Du behauptest, ja angeblich C++ Programmierer zu sein. Und darauf bauen meine Kommentare auf. Funktionen, Schleifen, alles nichts Neues wenn man C++ beherrscht.
Das Forum dient dazu, Leuten die Python lernen wollen, zu helfen, Stück für Stück besser zu werden; dazu müssen sie aber erst einmal zeigen, wo sie gerade stehen.
Antworten