I have 3 python classes. The Order class has an attribute that is a list passed at instantiation. The Cue class also has a list attribute but is initialized with an empty list. My goal is to update a group of Cue class instances dynamically by a parsing function that loops over Order.items list and evaluates the condition of in Cue.items_they_need_on_their_q list attribute and if True add it to the Cue.working attribute of that instance.
from itertools import count
class Item(object):
_ids = count(0)
def __init__(self, name, inventory):
self.item_number = next(self._ids)
class Order:
_order_ref_number = count(0)
def __init__(self, items=[]):
self.order_ref_number = next(self._order_ref_number)
self.items = items
class Cue:
""" alright, queue, im lazy """
def __init__(self, working=[], sold=[]):
self.working = working
self.sold = sold
items_they_need_on_their_q = []
itemOne = Item(name='cow', inventory='100')
itemTwo = Item(name='pig', inventory='10')
itemThree = Item(name='goat', inventory='6')
itemFour = Item(name='buick', inventory='1000')
stationOne = Cue()
stationOne.items_they_need_on_their_q = [itemOne.item_number, itemThree.item_number]
stationTwo = Cue()
stationTwo.items_they_need_on_their_q = [itemTwo.item_number, itemFour.item_number]
def parse_order(takesOrderClass):
for i in takesOrderClass.items:
if i.item_number in stationOne.items_they_need_on_their_q:
stationOne.working.append(i)
if i.item_number in stationTwo.items_they_need_on_their_q:
stationTwo.working.append(i)
bob = Order(items=[itemOne,itemTwo,itemFour])
parse_order(bob)
print(stationOne.working)
print(stationTwo.working)
I expected it would append only those items that resolved to True in the list and route those. Instead I get all three Item objects in both instances of Cues working lists
output: [<__main__.Item object at 0x0000017E19B48FD0>, <__main__.Item object at 0x0000017E19B48F70>, <__main__.Item object at 0x0000017E19B48D90>]
[<__main__.Item object at 0x0000017E19B48FD0>, <__main__.Item object at 0x0000017E19B48F70>, <__main__.Item object at 0x0000017E19B48D90>]
When I print the conditions to sanity check the order condition satisfies that indeed stationOne returns [True,False,False] when the order is looped over comparing items as well as stationTwo returning [False,False,True].
I also tried using the following conditions in the loop
if i.item_number == True:
##and ...
check_one = i.item_number in stationOne.items_they_need_on_their_q
if check_one == True:
do the thing
##and ...
if check_one == 1:
do the thing
If these are all evaluating truthwise correctly why are the lists not effectively filtered and being populated with all results and what would be a better solution?