-
Notifications
You must be signed in to change notification settings - Fork 0
/
bank_account.py
46 lines (35 loc) · 1.76 KB
/
bank_account.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class InsufficientFundsException(Exception):
pass
class NoSubaccountException(Exception):
pass
class BankAccount:
def __init__(self, initial_balance=0.0, yearly_fee=0.0):
self.subaccounts = {"Main": initial_balance}
self.yearly_fee = yearly_fee
def deposit(self, amount, account_name="Main"):
if account_name not in self.subaccounts:
raise NoSubaccountException(f"No subaccount named {account_name} found!")
self.subaccounts[account_name] += amount
def withdraw(self, amount, account_name="Main"):
if account_name not in self.subaccounts:
raise NoSubaccountException(f"No subaccount named {account_name} found!")
# Check if the balance is None and set it to 0 if it is
balance = self.subaccounts.get(account_name, 0) or 0.0
if balance < amount:
raise InsufficientFundsException("Insufficient funds!")
self.subaccounts[account_name] -= amount
def add_subaccount(self, account_name, initial_balance=0.0):
if account_name in self.subaccounts:
raise ValueError(f"Subaccount named {account_name} already exists!")
self.subaccounts[account_name] = initial_balance
def remove_subaccount(self, account_name):
if account_name not in self.subaccounts:
raise NoSubaccountException(f"No subaccount named {account_name} found!")
if self.subaccounts[account_name] > 0.0:
raise ValueError("Cannot remove a subaccount with a positive balance!")
del self.subaccounts[account_name]
def total_balance(self):
return sum(self.subaccounts.values())
def apply_yearly_fees(self):
for account_name in self.subaccounts:
self.subaccounts[account_name] -= self.yearly_fee