QUESTION

The __str__ method of the Bank class (in bank.py) returns a string containing the accounts in random order. Design and implement a change that causes the accounts to be placed in the string in ascending order of name. Implement the __str__ method of the bank class so that it sorts the account values before printing them to the console. In order to sort the account values you will need to define the __eq__ and __lt__ methods in the SavingsAccount class (in savingsaccount.py). The __eq__ method should return True if the account names are equal during a comparison, False otherwise. The __it__ method should return True if the name of one account is less than the name of another, False otherwise.

The program should output in the following format:

Test for createBank:

Name: Jack

PIN: 1001

Balance: 653.0

Name: Mark

PIN: 1000

Balance: 377.0

... ... ...

Name: Name7

PIN: 1006

Balance: 100.0

AND

this is the bank.py provided by the exercise

"""

File: bank.py

Project 9.3

The str for Bank returns a string of accounts sorted by name.

"""

import pickle

import random

from savingsaccount import SavingsAccount

class Bank:

"""This class represents a bank as a collection of savings accounts.

An optional file name is also associated

with the bank, to allow transfer of accounts to and

from permanent file storage."""

"""The state of the bank is a dictionary of accounts and a file name. If the file name is None, a file name for the bank has not yet been established."""

def __init__(self, fileName = None):

"""Creates a new dictionary to hold the accounts.

If a file name is provided, loads the accounts from

a file of pickled accounts."""

self.accounts = {}

self.fileName = fileName

if fileName != None:

fileObj = open(fileName, 'rb')

while True:

try:

account = pickle.load(fileObj)

self.add(account)

except Exception:

fileObj.close()

break

def __str__(self):

"""Returns the string representation of the bank."""

# TODO: Sort the account values before printing to the screen

return "\n".join(map(str, self.accounts.values()))

def makeKey(self, name, pin):

"""Returns a key for the account."""

return name + "/" + pin

def add(self, account):

"""Adds the account to the bank."""

key = self.makeKey(account.getName(), account.getPin())

self.accounts[key] = account

def remove(self, name, pin):

"""Removes the account from the bank and

and returns it, or None if the account does

not exist."""

key = self.makeKey(name, pin)

return self.accounts.pop(key, None)

def get(self, name, pin):

"""Returns the account from the bank,

or returns None if the account does

not exist."""

key = self.makeKey(name, pin)

return self.accounts.get(key, None)

def computeInterest(self):

"""Computes and returns the interest on

all accounts."""

total = 0

for account in self._accounts.values():

total += account.computeInterest()

return total

def getKeys(self):

"""Returns a sorted list of keys."""

return []

def save(self, fileName = None):

"""Saves pickled accounts to a file. The parameter

allows the user to change file names."""

if fileName != None:

self.fileName = fileName

elif self.fileName == None:

return

fileObj = open(self.fileName, 'wb')

for account in self.accounts.values():

pickle.dump(account, fileObj)

fileObj.close()

# Functions for testing

def createBank(numAccounts = 1):

"""Returns a new bank with the given number of

accounts."""

names = ("Brandon", "Molly", "Elena", "Mark", "Tricia",

"Ken", "Jill", "Jack")

bank = Bank()

upperPin = numAccounts + 1000

for pinNumber in range(1000, upperPin):

name = random.choice(names)

balance = float(random.randint(100, 1000))

bank.add(SavingsAccount(name, str(pinNumber), balance))

return bank

def testAccount():

"""Test function for savings account."""

account = SavingsAccount("Ken", "1000", 500.00)

print(account)

print(account.deposit(100))

print("Expect 600:", account.getBalance())

print(account.deposit(-50))

print("Expect 600:", account.getBalance())

print(account.withdraw(100))

print("Expect 500:", account.getBalance())

print(account.withdraw(-50))

print("Expect 500:", account.getBalance())

print(account.withdraw(100000))

print("Expect 500:", account.getBalance())

def main(number = 10, fileName = None):

"""Creates and prints a bank, either from

the optional file name argument or from the optional

number."""

testAccount()

## if fileName:

## bank = Bank(fileName)

## else:

## bank = createBank(number)

## print(bank)

if __name__ == "__main__":

main()

Public Answer

BYLVNG The First Answerer