2016-12-11 2 views
0

Написание функции для реставрации книг, в которых Библиотека пытается обновить книгу, в настоящее время хранящуюся указанным Патроном. Книга перенесена из заимствований покровителя в список доступных книг библиотеки. Я закодировал большую часть этого, но я не уверен, что мой цикл верен, и я понятия не имею, куда вставить мой missingIdError, любые предложения? Примечание. У меня также есть класс Patron и они уже определены вместе с идентификатором, поэтому не нужно беспокоиться о недостающем классе.Функции в методах класса: где поднимать ошибки?

class DuplicateIdError (Exception): 
    def __init__(self, id, category = "Book" or "Patron"): 
     self.id = int(id) 
     self.category = str(category) 

    def __str__(self): 
     return 'duplicate {} ID: #{}'.format(self.category,self.id) 

    def __repr__(self): 
     return 'duplicate {} ID: #{}'.format(self.category,self.id) 

class MissingIdError (LookupError): 
    def __init__(self, id, category = "Book" or "Patron"): 
     self.id = int(id) 
     self.category = str(category) 

    def __str__(self): 
     return 'duplicate {}: {}'.format(self.id, self.category) 

    def __repr__(self): 
     return 'duplicate {}: {}'.format(self.id, self.category) 

class Library: 
    def __init__(self, books=None, patrons=None): 
     self.books = [] 
     self.patrons = [] 

    def __str__(self): 
     return "Library(<{}>, <{}>)".format(self.self.books, self.patrons) 

    def __repr__(self): 
     return "Library(<{}>, <{}>)".format(self.self.books, self.patrons) 

    #Returns None. 
    #Raises a DuplicateIdError if there's already a book in the library with that id#. 
    #Raises a MissingIdError if the patron or book wasn't found 

    def reshelve_book(self, patron_id, book_id): 
     for patron in self.patrons: 
      for book in self.books: 
       try: 
        if book.book_id == book_id: 
         raise DuplicateIdError(book_id,"Book") 
        elif book.book_id != book_id: 
         self.books.append(book) 
         book.borroweds.remove(book) 

ответ

1

Всего пару простых охранников даст вам другого исключение:

def reshelve_book(self, patron_id, book_id): 
    if patron_id not in self.patrons: 
     raise MissingIdError(patrod_id, 'Patron') 

Я не понимаю book.borroweds.remove(book) но предположительный вам необходимо проверить book_id заимствован.

Вам действительно нужна петля?

def reshelve_book(self, patron_id, book_id): 
    if patron_id not in self.patrons: 
     raise MissingIdError(patrod_id, 'Patron') 
    if book_id in self.books: 
     raise DuplicateIdError(book_id,"Book") 
    try: 
     book = self.patrons[patron_id].borrowed_books[book_id] 
    except KeyError: 
     raise MissingIdError(book_id, 'Book') 
    self.books[book_id] = book 
    del self.patrons[patron_id].borrowed_books[book_id] 

КСТАТИ: ваши конструкторы исключений не делают то, что я думаю, что вы думаете, что делает:

def __init__(self, id, category = "Book" or "Patron"): 

эквивалентно делать:

def __init__(self, id, category = True): 

я бы просто не ставить по умолчанию для category:

def __init__(self, id, category): 
+0

Спасибо за подробное объяснение. Я действительно думал о сложности функции и хорошо знал о конструкторе. –

+0

С момента его восстановления, взяв книгу из заимствованного списка владельца и будучи вставленным обратно в библиотеку. –

+0

Итак, я предполагаю, что у каждого покровителя есть список заимствованных книг ... обновлено – AChampion

Смежные вопросы