Seite 1 von 1

Python key error?

Verfasst: Freitag 16. April 2021, 14:36
von Backware
Kann mir mal wer sagen wie ich das problem löse da ich in internet einfach keine lösungen finde.
python version: 3.6.5

Mein code um ein json data bank zu erstellen die für ein bot gedacht ist die funktion wird dann importiert was ja eigentlich kein problem ist.

Code: Alles auswählen

import json

filename = "database/bank.json"

def konto(id):
    with open(filename, "r") as f:
        users = json.load(f)

    if str(id) in users:
        return False
    else:
        users[str(id)]["bank"] = 0
        users[str(id)]["wallet"] = 0
 
    with open(filename, "w") as f:
        json.dump(users, f)

konto(302428535883038721)

Code: Alles auswählen

Traceback (most recent call last):
  File "main.py", line 5, in <module>
    import functions.bank as bank
  File "C:\Users\Backware\Desktop\Economy\functions\bank.py", line 18, in <module>
    konto(302428535883038721)
  File "C:\Users\Backware\Desktop\Economy\functions\bank.py", line 12, in konto
    users[str(id)]["bank"] = 0
KeyError: '302428535883038721'

Re: Python key error?

Verfasst: Freitag 16. April 2021, 14:44
von __deets__
Du pruefst doch, ob str(id) in deiner "Datenbank" ist. Ist es nicht. Und dann tust du so, als ob es doch drin waere: users[str(id)]["bank"] versucht auf einen Eintrag zuzugreifen. Und da ist halt keiner.

Was du wahrscheinlich suchst ist

Code: Alles auswählen

users[id_] = dict(bank=0, wallet=0)
Die Fehlerbehandlung mit Return-code ist schlecht und selbst ein Fehler, denn jetzt gibst du implizit None zurueck, was nahezu ununterscheidbar von False ist. Und andauernd str(id) aufzurufen, statt einmal vernuenftig die Erwartung, dass das ein String ist, zu codieren, durch zb ein

id_ = str(id_)

ganz am Anfang, ist auch ungeschickt.

Und zu guter Letzt wird dir dein relativer Pfad der Datebank um die Ohren fliegen, das funktioniert nicht so, wie du denkst, dass es funktioniert. Das muss ein absoluter Pfad sein, oder du musst es zu einem machen, unter Zuhilfenahme von __file__ und pathlib.