Estoy atascado en la aplicación de reglas en una clase, como forzar el cambio de algunos valores si alguna regla está presente, etc. Sin embargo, no puedo pasar las reglas a la clase. Aquí está mi código y lo que necesito:

class Item: 
    valid_item_dict = {"a":20, "b":30, "c":40, "d":50}
    def __init__(self, item_id):
        self.item_id = item_id
        self.item_cost = Item.valid_item_dict.get(self.item_id)

class checks:
    def __init__(self):
        self.content = list()
        
    def cheque(self, item):
        self.content.append(item)
        
    def totals(self):
        self.total = sum([self.item_counter().get(itm)*Item.valid_item_dict.get(itm) for\
                          itm in list(self.item_counter().keys())])
        return self.total
    
    def item_counter(self):
        self.item_count_list = [itms.item_id for itms in self.content]
        self.item_count_dict = dict((item, self.item_count_list.count(item)) for item in
                                     self.item_count_list)
        return self.item_count_dict

# Adding items to the list
item1 = Item("a")
item2 = Item("a")
item3 = Item("a")
item4 = Item("b")

# instatiance of class
cx = checks()
cx.cheque(item1)
cx.cheque(item2)
cx.cheque(item3)
cx.cheque(item4)

cx.totals()
>>> 90 (20*3 (from a) + 1*30 (from b))

En casos normales, esto funciona bien, pero tengo un montón de reglas que necesito agregar y antes estaba pensando en agregar reglas if-else en el método de totales de la clase "cheques". Pero es una forma más generalizada de agregar estas reglas. La regla es algo así como si tenemos 3 tipos de producto a, entonces el valor de 'a' se reduce de 20 a 10. Repasé esta pregunta y estoy tratando de usarla, pero cualquier ayuda sería maravillosa. (Python cómo para hacer un conjunto de reglas para cada clase en un juego)

0
Mr. Confused 11 mar. 2021 a las 22:13

1 respuesta

La mejor respuesta

Es posible que desee utilizar un bucle más directo para implementar estas reglas y hacer que su código sea más claro. Me resulta más fácil mantener una lógica compleja que intentar codificar golf como resultado de 1 línea:

 from collections import Counter, namedtuple
 
 Rule = namedtuple("Rule", ["threshold", "newvalue"])
 """rule: if count is greater than or equal to threshold, replace with newvalue"""

 
 class Item:
    rules = {'a': Rule(3, 10)}

    ...

class checks:

    ...

    def totals(self):
        counts = Counter(self.content)
        self.total = 0
        for count in counts:
            value = Item.valid_item_dict[count]
            rule = Item.rules.get(count, Rule(0, value))
            if counts[count] >= rule.threshold:
                value = rule.newvalue
            self.total += value*counts[count]

        return self.total
       

Supongo que desea que el resultado de su muestra sea 60 y no 90.

0
Josh English 11 mar. 2021 a las 19:47