Code:
from dataclasses import dataclass
from typing import Callable


@dataclass
class Book:
    title: str
    author: str
    isbn: str
    is_available: bool = True


@dataclass
class Library:
    books: dict[str, Book]

    def add_book(self, b: Book) -> None:
        self.books[b.isbn] = b

    def borrow_book(self, isbn: str) -> str:
        if isbn not in self.books:
            return f"Sorry, this book ({isbn}) is not in our library."
        b: Book = self.books[isbn]
        if not b.is_available:
            return f"Sorry, '{b.title}' is currently not available."
        b.is_available = False
        return f"You have borrowed '{b.title}' by {b.author}."

    def return_book(self, isbn: str) -> str:
        if isbn not in self.books:
            return "This book does not belong to our library."
        b: Book = self.books[isbn]
        b.is_available = True
        return f"Thank you for returning '{b.title}'."

    def display_books(self, sort_by: None | Callable[[Book], str] = None) -> None:
        iterable = list(self.books.values())
        if sort_by is not None:
            iterable = sorted(iterable, key=sort_by)
        for b in iterable:
            print("Book:")
            print(f"  Title: {b.title}")
            print(f"  Author: {b.author}")
            print(f"  ISBN: {b.isbn}")
            print(f"  Available: {b.is_available}")
            print("**")


library = Library({})

# # Adding books
library.add_book(Book(title="1984", author="George Orwell", isbn="2345678901"))
library.add_book(Book(title="To Kill a Mockingbird", author="Harper Lee", isbn="1234567890"))


# # Displaying books
library.display_books()

print("--------------------")

# Borrowing a book
print(library.borrow_book("123456789"))
print(library.borrow_book("1234567890"))
print(library.borrow_book("1234567890"))  # Trying to borrow again

# # Returning a book
print(library.return_book("1234567890"))
print(library.return_book("1234567890"))  # Returning again

print("--------------------")


# # Displaying books again
library.display_books(sort_by=lambda b: b.isbn)
Last modified: Monday, 27 May 2024, 17:00