0

I don't understand why this happens:

When I use the add_promo() function to add a promo object directly to self.spl (using its self.spl.add(promo) function) each Day object gets a different StoryPromoList object.

But if I add the promo through self.cpl.add_promo(promo) which basically just does the same thing but with an extra step, each Day object gets assigned the same StoryPromoList object, instead of different objects.

The StoryPromoList objects are created but only the last one is used for all days for some reason.

This is the Day class:

class Day():
    def __init__(self, date:date):
        self.date = date
        self.spl = StoryPromoList()
        self.fpl = FeedPromoList()
        self.cpl = CombinedPromoList(self.spl, self.fpl)
        self.weekday = self.date.weekday()      

    def __repr__(self):
        return f"<Day object (date='{self.date}')>"

    def add_promo(self, promo):
        self.cpl.add_promo(promo)
        # assign promo to the corresponding timeblock

    def get_all_promos(self):
        print(self.spl._id, self.date, self.cpl)
        return {'story_promos': [p for p in self.cpl.spl.list], 'feed_promos': [p for p in self.cpl.fpl.list]}

When I execute the get_all_promos() function for each day I get this output:

6 2021-09-27 <__main__.CombinedPromoList object at 0x00000244AADABBE0>
6 2021-09-28 <__main__.CombinedPromoList object at 0x00000244AADAB9A0>
6 2021-09-29 <__main__.CombinedPromoList object at 0x00000244AADAB730>
6 2021-09-30 <__main__.CombinedPromoList object at 0x00000244AADAB4C0>
6 2021-10-01 <__main__.CombinedPromoList object at 0x00000244AADAB250>

This is the CombinedPromoList class:

class CombinedPromoList():
    def __init__(self, spl=StoryPromoList(), fpl=FeedPromoList()) -> None:
        self.spl = spl
        self.fpl = fpl

    def add_promo(self, promo):
        if promo.type_name() == 'story':
            self.spl.add(promo)
        elif promo.type_name() == 'feed':
            self.fpl.add(promo)

And this is the StoryPromoList which is the same as FeedPromoList with minor differences:

class StoryPromoList():
    classes = []
    _id = 0
    def __init__(self, list=[]):
        self.id=StoryPromoList._id
        StoryPromoList._id += 1
        StoryPromoList.classes.append(self)
        self.list = list

    def add(self, storypromo:StoryPromo):
        self.list.append(storypromo)

raresm
  • 93
  • 1
  • 11
  • 1
    The problem is you are using mutable default arguments, like `list=[]`, so that there is a single list instance shared across all of your `StoryPromoList` instances. Please see the linked duplicates. – kaya3 Sep 27 '21 at 18:07
  • 1
    This explains the problem in some depth: https://docs.python-guide.org/writing/gotchas/ – Nathaniel Ford Sep 27 '21 at 18:08
  • Thank you! I managed to fix it. My code was full of mutable default arguments. Never doing that again, lol. – raresm Sep 27 '21 at 18:21

0 Answers0