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”是有原因的——这种语言的部分价值在于文化。这里有两个方面需要注意——第一,“包含电池”,第二,“不要重新发明轮子”。您正在重新实现 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 回答
1

线

for item in varlist: 

item用局部变量隐藏类。因此,当您使用它时,item()它会认为您正在尝试调用局部变量而不是类。你可以说你的类item永远不会被构造,因为它会失败,因为你没有向__init__

你也应该给你的班级打电话Item。一旦我这样做了,我就得到了预期的构造函数错误。

于 2013-04-24T22:28:36.293 回答