Skip to content

Example Class

Angeheftet Python3
  • Ich habe ja hier im Beitrag schon mal versucht zu erklären, wie man Daten in Python lädt und speichert. Als Beispiel dient mir meine BackupList. So lege ich das in meinen beiden Python Projekten meines Restic UI ab.

    Anhand dieses Beispieles habe ich mal eine Klasse gebaut, die das alles enthält. So in etwa ist das auch in meinen Projekten drin, da ich aber Zweifel habe das ich dort alles richtig gemacht habe, hier diese Basisarbeit. Soll auch mir die Grundlagen näher bringen.

    Für Profis, die hier mitlesen, ich freue mich über Verbesserungen und ich mache bestimmt auch einiges falsch. Also ran, einfach hier drunter kommentieren.

    Example Class

    Die Klasse beinhaltet die folgenden Funktionen.

    • Add

    • Update

    • Delete

    • Save JSON

    • Load JSON

    • Keys & Last Key

         import json
         
         
         class BackupList():
             """ Class for managing my backup data. Here only as a sample.
                 Functions Add, Update, Delete, Save JSON, Load JSON and Keys, Last Key implemented.
             """
         
             def __init__(self, name, repository):
                 # instantiate an empty dict
                 self.name = name
                 self.repository = repository
         
             @staticmethod
             def add(name, repository):
                 # Add an object
                 print("ADD", name, repository)
                 backups[(BackupList.last_key()) + 1] = BackupList(name, repository)
         
             @staticmethod
             def update(counter, name, repository):
             # Update an object
                 try:
                     backups[counter].name = name
                     backups[counter].repository = repository
                     backups.update()
                 except IOError:
                     print("Error")
         
             @staticmethod
             def delete(number):
                 # Delete an object
                 backups.pop(number)
         
             @staticmethod
             def keys():
                 # Create keys list
                 keys_list = []
         
                 # redo keys_list
                 for key in backups:
                     keys_list.append(key)
         
                 print("Keys:", keys_list)
         
             @staticmethod
             def save_json():
                 # Save my class as JSON
                 backups_json = {}
                 for count, value in enumerate(backups):
                     print("Save", backups[value].name)
                     backups_json[value] = {'name': backups[value].name, 'repository': backups[value].repository}
         
                 # save backups to JSON
                 with open('mydata.json', 'w') as f:
                     json.dump(backups_json, f)
         
             @staticmethod
             def load_json():
                 # load JSON
                 with (open('mydata.json', 'r')) as f:
                     backups_reload = json.load(f)
         
                 # Create objects for my class
                 for count, value in enumerate(backups_reload.values()):
                     print("Reload", value['name'], "Counter:", count)
                     backups[count] = BackupList(value['name'], value['repository'])
         
             @staticmethod
             def last_key():
                 # Create last key
                 last_key = list(dict.keys(backups))[-1]
                 return last_key
         
         
         # create an empty dict
         backups = {}
         
         # Load data from filesystem
         BackupList.load_json()
         
         
         def main():
             # Add an entry
             #BackupList.add('Test02', '/home/frankm/repo2')
             #BackupList.add('Test03', '/home/frankm/repo3')
             #BackupList.add('Test04', '/home/frankm/repo4')
         
             # Print some data
             #print(backups[0].name)
             #print(backups[1].name)
         
             # Del an entry
             #BackupList.delete(1)
         
             print ('-------------')
         
             # Print keys
             BackupList.keys()
         
             print ('-------------')
         
             # Save data as JSON file
             BackupList.save_json()
         
             print ('-------------')
         
             # Uncomment to update entry backups[4]
             #BackupList.update(4, "TESTING6", "REPO")
             # After update we must save the data
             #BackupList.save_json()
         
             print ('-------------')
         
             # Print data from backups
             for count, value in enumerate(backups):
                 print("Control", count, backups[value].name)
         
         
         
         if __name__ == "__main__":
             main()
      

    Ich hoffe es hilft dem ein oder anderen Einsteiger in das Thema JSON und Daten dauerhaft speichern.

    Den Beispielcode findet ihr -> https://gitlab.com/-/snippets/2438459

  • FrankMF FrankM hat am auf dieses Thema verwiesen
  • Aufgrund diverser Code Stellen in meinen beiden Projekten, die etwas wirr aussahen, habe ich ja obige Grundlagenarbeit gemacht gehabt.

    Am Wochenende habe ich dann das Erlernte in die Tat umgesetzt und mein PyWebIO Projekt vollständig umgebaut. Dabei konnte ich viel Code eliminieren und es wesentlich übersichtlicher gestalten.

    Dabei lernt man dann auch immer wieder eine Menge dazu und so entstand meine erste Funktion mit **kwargs 🙂

    @staticmethod
        def update(counter, **kwargs):
    

    Wer was im Code wühlen möchte, findet das Repo zu meinem Restic UI auf Basis von PyWebIO hier.

    Da die Funktionen jetzt alle drin sind und hoffentlich auch alle funktionieren, mach ich mal die Tage wieder ein Video. Dabei finde ich immer die meisten Fehler 😁

  • FrankMF FrankM hat dieses Thema am angepinnt
  • In meinem PywebIO Projekt tauchte heute ein alter Bekannter auf. Wenn ich einen Eintrag (innerhalb der Liste) löschte, war das etwas durcheinander 🤔

    Ja, den Fehler kenne ich schon was länger und stolper immer mal wieder drüber. Heute z.B.

    Also mal grübeln 🤓

    Das mache ich, wenn ich einen Eintrag lösche

    case 'Yes':
       # delete entrie
       BackupList.delete((line - 1))
    
       # save json
       BackupList.save_json()
     
       # Load data from filesystem
       BackupList.load_json()
    
       # Reload Tab Backup
       backup()
    

    Ich mache folgendes

    • lösche den Eintrag
    • speicher die Liste
    • lade die Liste
    • baue den Tab wieder auf

    Das führt aber dazu, das meine Liste die als Objekt im Speicher steht nicht aktuell ist. Im Gegenteil, da ist dann etwas Unordnung. Ich brauchte also die Möglichkeit mein Objekt backups irgendwie zurückzusetzen.

    Mal gegoogelt und die Dinge sind manchmal wirklich total easy 🙂

    # clear dict
    backups.clear()
    

    Das leert das Objekt und im nächsten Schritt kann ich es wieder befüllen.

    Lösung

    case 'Yes':
       # delete entrie
       BackupList.delete((line - 1))
    
       # save json
       BackupList.save_json()
     
       # clear dict
       backups.clear()
       
       # Load data from filesystem
       BackupList.load_json()
    
       # Reload Tab Backup
       backup()
    

    Problem erledigt. Damit ich das noch finde, wenn mein Kopf das nicht mehr hergibt, notiere ich das hier.

  • Pycharm - Interpreter Settings

    Python3
    1
    0 Stimmen
    1 Beiträge
    119 Aufrufe
    Niemand hat geantwortet
  • Redis - Datenbank Zugriff mit Python

    Redis
    3
    0 Stimmen
    3 Beiträge
    143 Aufrufe
    FrankMF

    Ich bin mit der Lernkurve noch nicht so richtig zufrieden. Eine Frage die sich mir stellte, geht das einfacher? Der Ursprung meiner Datenbank Struktur liegt in einem anderen Projekt, wo ich versucht habe Daten permanent in einem File zu speichern. Dazu hatte ich damals JSON genommen. Deswegen auch diese Zeilen

    self.project = str(db_client.json().get('settings', '$..project')[0]) or self.project

    Gut, ich hatte dann mal ChatGPT gefragt, wie macht man das so 'normalerweise'? es kam eine Klasse heraus, die ich dann intensiv ausprobiert habe, ein wenig umgebaut usw. So lange, bis ich der Meinung war, ok ich habe es verstanden. Jetzt nutzte der Code auch mehr Redis Funktionen, wie

    self.client.hset('settings', name, json.dumps(data))

    Es waren jetzt folgende Funktionen drin

    hset hexists hdel hget

    Dokumentation -> https://redis.io/commands/hset/

    Beim Durchlesen des Codes hatte ich jetzt mehr das Gefühl, so muss das sein 🙂

    In RedisInsight sieht das dann jetzt so aus.

    393195f7-1017-4285-8fca-734ee6b4bff7-grafik.png

    Klasse class PortfolioSettings: def __init__(self, host='172.17.0.2', port=6379, db=0): if args.test_mode == 1: self.client = redis.StrictRedis(host=SERVER_IP, port=port, db=TEST[0]) else: self.client = redis.StrictRedis(host=SERVER_IP, port=port, db=LIVE[0]) def set_settings(self, name, data): """Init settings if db don't exist""" if not self.client.hexists('settings', name): self.client.hset('settings', name, json.dumps(data)) return True return False def edit_setting(self, name, data): """Edit an entry in settings""" if self.client.hexists('settings', name): self.client.hset('settings', name, json.dumps(data)) return True return False def delete_setting(self, name): """Delete an entry in settings""" return self.client.hdel('settings', name) def get_setting(self, name): """Get an entry in settings""" setting = self.client.hget('settings', name) return json.loads(setting) if setting else None def get_all_settings(self): """Get all entries in settings""" settings = self.client.hgetall('settings') return {k.decode(): json.loads(v) for k, v in settings.items()}

    Und hier die Initialisierung

    settings_data = PortfolioSettings() ##################### # Will only be executed if DB is not available! ##################### if not settings_data.get_all_settings(): # Settings initialisieren print("INIT") settings_data.set_settings("project", "Portfolio") settings_data.set_settings("version", "0.0.3") settings_data.set_settings("theme", "dark") settings_data.set_settings("url_list", ["https://www.onvista.de/aktien/Deutsche-Telekom-Aktie-DE0005557508"]) settings_data.set_settings("exchange_list", ['DKB','Smartbroker','BUX'])

    Teile der Klasse sind [KI-generiert]

    Ich war zufrieden und habe die Klasse dann in mein Projekt übernommen und den Code überall entsprechend angepasst.

  • PyPi - Pakete ein Sicherheitsproblem?

    Python3
    1
    0 Stimmen
    1 Beiträge
    90 Aufrufe
    Niemand hat geantwortet
  • Restic UI - Stand Januar 2023

    PyWebIO
    1
    0 Stimmen
    1 Beiträge
    115 Aufrufe
    Niemand hat geantwortet
  • Python - Dict -> JSON und umgekehrt

    Python3
    1
    0 Stimmen
    1 Beiträge
    287 Aufrufe
    Niemand hat geantwortet
  • PyWebIO

    Angeheftet PyWebIO
    1
    0 Stimmen
    1 Beiträge
    191 Aufrufe
    Niemand hat geantwortet
  • Python3 - VSCodium Language Settings

    Python3
    3
    0 Stimmen
    3 Beiträge
    135 Aufrufe
    FrankMF

    Ich habe da jetzt gestern stundenlang mit rum gespielt, insbesondere Deinstallation, Neuinstallation, VSCode Installation usw. Das ging einfach nicht.

    Irgendwo meine ich dann gelesen zu haben, das VSCode auf python 3.9 festgenagelt ist und deswegen so einige Dinge nicht gehen.

    Nagelt mich darauf nicht fest, ich bin in dieser Coding Welt kein Profi.

    Dann fiel mir ein, das ich schon vor einigen Monaten mal kurz einen Blick in Pycharm geworfen hatte. Gefiel mir damals gar nicht.

    Das habe ich heute mal auf die Platte geworfen um zu schauen, ob das vernünftig mit dem o.g. Problem umgehen kann.

    6f1c3906-05a3-4126-81d4-7fdf6aa27faa-grafik.png

    Puuuh, da kann man ja noch viel mehr einstellen als bei VSCode, oder mindestens ähnlich viel. Das kann einen ganz schön überfordern. Also Stück für Stück die nächsten Tage.

    Was ist mir positiv aufgefallen?

    Wenn ich VSCodium neu installiert habe, habe ich unheimlich mit Python Versionen, pipenv usw. zu kämpfen gehabt. Bis da mein Projekt wieder lief, konnte schon mal was Zeit vergehen.

    Mit Pycharm Ordner ausgewählt, angeklickt das man dem Coder vertraut. Noch eine Python Version ausgewählt, danach fragt er das er eine pipenv Umgebung gefunden hat und diese nutzen möchte. Ja angeklickt und fertig. Keine zwei Minuten und das Projekt lief wieder 🤓

    Erster Git Commit ging auch sofort und ohne Murren.

    Schon mal ganz viele Pluspunkte gesammelt.

    Was mich aktuell beschäftigt, ist der Tab Problems, da hatte ich vorher deutlich weniger. Da muss ich mich noch was einarbeiten und schauen, wo man das alles einstellen kann.

    Ich halte euch auf dem Laufenden..

    Vielleicht fliegt ja das VSCo** Zeug runter!? Mal sehen..

  • Qt 5 Designer

    Python3
    1
    0 Stimmen
    1 Beiträge
    108 Aufrufe
    Niemand hat geantwortet