如何将用户输入到python数据库?

时间:2013-01-13 17:26:18

标签: python database shelve

  1. 为什么菜单无法启动(由Roman Susi解决)
  2. 为什么菜单无法按预期工作(错误如下)
  3. 如何解决foo.add代码中的错误?

    Traceback (most recent call last): File "C:\Users\User\Desktop\phonedatabase.py", line 81, in <module> openphonedb() File "C:\Users\User\Desktop\phonedatabase.py", line 23, in openphonedb for entry in foo.add(name, number, showtype): TypeError: 'NoneType' object is not iterable

  4. 在输入“类型”

    后添加新用户时会发生此错误
    import shelve
    import string
    
    UNKNOWN = 0
    HOME = 1
    WORK = 2
    FAX = 3
    CELL = 4
    
    def openphonedb():
        foo = phonedb()
        print "What would you like to do?"
        print "Add = 1, Lookup = 2, Exit = 3"
        entry = int(raw_input('>> '))
        if entry == 1 :
                namelookup = raw_input('Please enter a name: ')
                for entry in foo.lookup(namelookup):
                        print '%-40s %s (%s)' % (entry.name, entry.number, entry.showtype() )
        elif entry == 2:
                name = raw_input('Name: ')
                number = raw_input('Number: ')
                showtype = input('Type (UNKNOWN, HOME, WORK, FAX, CELL): \n>> ')
                for entry in foo.add(name, number, showtype):           
                        print '%-40s %s (%s)'% (entry.name, entry.number, entry.showtype() )
        elif entry == 3:
                print "Close Successful"
                quit
        else:
                print "Invalid."
                openphonedb()
    
    class phoneentry:
        def __init__(self, name = 'Unknown', number = 'Unknown',
            type = UNKNOWN):
            self.name = name
            self.number = number
            self.type = type
    
    #  create string representation
        def __repr__(self):
            return('%s:%d' % ( self.name, self.type ))
    
    #  fuzzy compare or two items
        def __cmp__(self, that):
            this = string.lower(str(self))
            that = string.lower(that)
    
            if string.find(this, that) >= 0:
                return(0)
            return(cmp(this, that))
    
        def showtype(self):
            if self.type == UNKNOWN: return('Unknown')
            if self.type == HOME: return('Home')
            if self.type == WORK: return('Work')
            if self.type == FAX: return('Fax')
            if self.type == CELL: return('Cellular')
    
    class phonedb:
        def __init__(self, dbname = 'phonedata'):
            self.dbname = dbname;
            self.shelve = shelve.open(self.dbname);
    
        def __del__(self):
            self.shelve.close()
            self.shelve = None
    
        def add(self, name, number, type = HOME):
            e = phoneentry(name, number, type)
            self.shelve[str(e)] = e
    
        def lookup(self, string):
            list = []
            for key in self.shelve.keys():
                e = self.shelve[key]
            if cmp(e, string) == 0:
                list.append(e)
    
            return(list)
    #edit
    if __name__ == '__main__':
        openphonedb()
    

2 个答案:

答案 0 :(得分:0)

也许,你只是忘了打电话给openphonedb()? 添加到最后:

if __name__ == '__main__':
    openphonedb()

此外,“戒烟”在那里做什么?

答案 1 :(得分:0)

代码有其他问题,但关于问题的第一部分,将条目作为字符串进行比较(如果用户键入“a”,则不会出现错误)?

def openphonedb():
    foo = phonedb()
    print "What would you like to do?"
    print "Add = 1, Lookup = 2, Exit = 3"
    while True:  # note this
        entry = raw_input('>> ')  # removed int()
        if entry == '1' :
            namelookup = raw_input('Please enter a name: ')
            for entry in foo.lookup(namelookup):
                print '%-40s %s (%s)' % (entry.name, entry.number, entry.showtype() )
        elif entry == '2':
            name = raw_input('Name: ')
            number = raw_input('Number: ')
            showtype = input('Type (UNKNOWN, HOME, WORK, FAX, CELL): \n>> ')
            for entry in foo.add(name, number, showtype):           
                print '%-40s %s (%s)'% (entry.name, entry.number, entry.showtype() )
        elif entry == '3':
            print "Close Successful"
            exit()  # note this also
        else:
            print "Invalid."
相关问题