3

Python を使用して値を設定したり、値を取得したりできる単純なローカル データベースを作成しようとしていますが、このエラーが発生し続けます。

#Simple Database
#Functions include      Set[name][value]
#                       Get[name]
#                       Unset[name]
#                       Numequalto[value]
#                       End
#                       Begin, Rollback, Commit

varlist = []
ops = []
class item:
        def __init__(self,name,value):
                self.name = name
                self.value = value
class db:
    def __init__(self):
            self.varlist = []
            self.ops = []
    def Set(self,nm,val):
            changed = False                 #Bool for keeping track of update
            for item in varlist:    #run through current list
                    if item.name == nm:     #If the name is found
                            item.value = val #update the value
                            changed = True  #found it
                            break                   #exit if found
            if not changed:
                    newitem = item() #Create a new one and append it
                    newitem.name = nm
                    newitem.value = val
                    varlist.append(newitem)
    def Get(key):
            for item in varlist:
                    if item.name == key:
                            return item.value
                            break

    def Unset(key):
            for item in varlist:
                    if item.name == key:
                            item.value = -1
                            break

    def Numequalto(key):
            count = 0
            for item in varlist:
                    if item.value == key:
                            count+=1
            return count

def main():
    newdb = db()
    varlist=[]
    comm = "" #prime it
    while comm.lower() != "end":
        comm = input("Command: ")
        if comm.lower() == "begin":
            print("----SESSION START---")
            while comm.lower() != "end":
                    comm = input("Command: ")
                    part = []
                    for word in comm.split():
                            part.append(word.lower())
                    print(part)
                    if part[0].lower()=="set":
                            newdb.Set(part[1],part[2])
                            print(varlist)
                    elif part[0].lower()=="get":
                            gotten = Get(part[1])
                            print(gotten)
                    elif part[0].lower()=="unset":
                            Unset(part[1])
                    elif part[0].lower()=="numequalto":
                            numequal = Numequalto(part[1])
                            print(numequal)
            print("Finished")
        else:
            print("--ERROR: Must BEGIN--")


if __name__ == "__main__":
    main()

これを実行し、コマンドを使用してリストに新しいアイテムを作成しようとすると

set a 25

次のエラーが表示されます。

Traceback (most recent call last):
File "/Volumes/CON/LIFE/SimpleDatabase.py", line 81, in <module>
    main()
File "/Volumes/CON/LIFE/SimpleDatabase.py", line 65, in main
    newdb.Set(part[1],part[2])
File "/Volumes/CON/LIFE/SimpleDatabase.py", line 27, in Set
    newitem = item() #Create a new one and append it
UnboundLocalError: local variable 'item' referenced before assignment

どんな助けでも大歓迎です。私はPythonにかなり慣れていません

4

3 に答える 3

1

黙示的にしようとしているのではなく、ここでは建設的です。独自の辞書を実装する意図を疑問視するコメントがある一方で、これを力強く述べた回答がないことを懸念しています。私がこれを言うのは、Python の一部 (セマンティクス、言語などを超えて) が文化だからです。物事が「Pythonic」であると言うのには理由があります。この言語の価値の一部は文化です。ここで注意すべき点が 2 つあります。1 つ目は「バッテリーが含まれていること」、2 つ目は「車輪の再発明をしないこと」です。あなたは、Python で最も基本的な複合 (矛盾した表現です) データ型を再実装しています。

>>> a = {}
>>> a['bob'] = 1
>>> a['frank'] = 2
>>> a
{'frank': 2, 'bob': 1}
>>> del a['frank']
>>> a
{'bob': 1}
>>> del a['bob']
>>> a
{}
>>> a['george'] = 2
>>> b = len([x for x in a.values() if x == 2])
>>> b
1

そして、あなたはそれを手に入れました-あなたが求めている機能を処理するpythonicの方法。

それ以上の機能や制限を追加しようとしている場合は、自分で作成するよりも、dict クラスから始めて拡張する方がよいでしょう。Python は「ダック型」であるため、既存の構造を基礎として使用することには大きな利点があります。これは、すべて同じパターンに分類されるためです。

于 2013-04-25T00:11:43.513 に答える
1

コードにいくつかの問題があります。

  1. item同じ名前のローカル変数でクラスをシャドウしています。
  2. varlistの代わりに使用していself.varlistます。
  3. 一部のクラス メソッドはself最初の引数を受け取りません。
  4. また、Python には、最初の文字を大文字にして名前を付けるという強力な規則があります。
于 2013-04-24T22:29:28.317 に答える