0
  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

このエラーは、「タイプ」を入力した後、新しいユーザーを追加するときに発生します

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()
4

2 に答える 2

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."
于 2013-01-13T18:00:25.603 に答える
0

おそらく、openphonedb() を呼び出すのを忘れただけですか? 最後に追加:

if __name__ == '__main__':
    openphonedb()

また、そこで「やめる」とは何をしているのですか?

于 2013-01-13T17:40:47.783 に答える