How to assign keys and values dynamically to an empty dict

Hi All,
I am trying to assign dynamically with dates as keys and values based up on the user input, but when i try to add the keys and values only the last values are getting populated. For example, For regular day 2022-04-12 to be a dict key and days and fare would be its values like below
{'2022-04-12': ('Tuesday', 0.95)}
On the flip side, when tried to add the dict with old dates 05th April then i am expecting the output to be like below, but instead it will display only the second key and its values basically the keys and values not appending
{'2022-04-12': ('Tuesday', 0.95), '2022-04-05': ('Tuesday', 0.95)}

import datetime
from datetime import date
import calendar
import pandas as pd
class Bus_Fare():

now = date.today()
week = calendar.day_name[now.weekday()]
_fare = 0.95


def __init__(self,count_sign=None):
    self.Dict_of_days = {}
    self.count_sign = count_sign
    if self.count_sign == 'R':
        Regular_day = self.Regular_day('Y')
        for i,k in Regular_day.items():
            self.Dict_of_days[i] = k
    elif self.count_sign == 'P':
        Previous_day = self.Previous_day('2022-04-05')
        for i,k in Previous_day.items():
            self.Dict_of_days[i] = k
        
    
def Regular_day(self,yes_or_no=None,date=now,day=week,fare=_fare):
    self.date = date
    self.day = day
    self.fare = fare
    init_dict = {}
    if yes_or_no == 'Y':
        init_dict[str(self.date)] = (self.day,self.fare)
    else:
        init_dict[str(self.date)] = (self.day,0)
    return init_dict

def Previous_day(self,pre_date):
    self.pre_date = pd.Timestamp(pre_date)
    self.preweek = self.pre_date.day_name()
    pre_day_update = self.Regular_day(yes_or_no='Y',date=self.pre_date.strftime('%Y-%m-%d'),day=self.preweek)
    return pre_day_update

def display(self):
    print(self.Dict_of_days)

Could you show also the part (or example) of how you are using this class? There’s couple of moving parts here and it isn’t clear how it’s intended to use it.

Looks like the problem is here -

image

Here, with every call to the Regular_day method, a new init_dict{} dictionary is created. So, it seems to loose its previous values may be. Coz every time it is declared newly when this method is called.

One solution would be to declare init_dict{} globally so that it retains all its values that are added subsequently or to pass it as an argument from method to method if you are following strict functional programming paradigm.

1 Like

thanks @skamat it worked. I have pasted the code below after the changes

import datetime
from datetime import date
import calendar
import pandas as pd


class Bus_Fare():
    
    now = date.today()
    week = calendar.day_name[now.weekday()]
    _fare = 0.95
    init_dict = {}
    
    
    def __init__(self,init_dict={},yes_or_no=None,date=now,day=week,fare=_fare,count_sign=None):
        self.init_dict = init_dict
        self.date = date
        self.day = day
        self.fare = fare
        self.yes_or_no = yes_or_no
        self.count_sign = count_sign
        if self.count_sign == 'R':
            Regular_day = self.Regular_Fare()
        elif self.count_sign == 'P':
            Previous_day = self.Previous_day('2022-04-05')
    
    def Regular_Fare(self):
        if self.yes_or_no == 'Y':
            self.init_dict[str(self.date)] = (self.day,self.fare)
        else:
            self.init_dict[str(self.date)] = (self.day,0)
        return self.init_dict
    
    def Previous_day(self,pre_date):
        self.pre_date = pd.Timestamp(pre_date)
        self.preweek = self.pre_date.day_name()
        #pre_day_update = self.Regular_day(self.yes_or_no='Y',date=self.pre_date.strftime('%Y-%m-%d'),day=self.preweek)
        #pre_day_update = self.Regular_day()
        if self.yes_or_no == 'Y':
            self.init_dict[str(self.pre_date.strftime('%Y-%m-%d'))] = (self.preweek,self.fare)
        else:
            self.init_dict[str(self.pre_date.strftime('%Y-%m-%d'))] = (self.preweek,0)
        return self.init_dict
    
    def display(self):
        print(self.init_dict)

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.