method chains logo method chains: mutate

1 2 3 4 5 6 7 8 9
Notes

This is the class that we have now.

class Clumper:
    def __init__(self, blob):
        self.blob = blob 

    def keep(self, *funcs):
        data = self.blob 
        for func in funcs:
            data = [d for d in data if func(d)]
        return Clumper(data)

    def head(self, n):
        return Clumper([self.blob[i] for i in range(n)])

    def tail(self, n):
        return Clumper([self.blob[-i] for i in range(1, n+1)])

    def select(self, *keys):
        return Clumper([{k: d[k] for k in keys} for d in self.blob])

    def mutate(self, **kwargs):
      data = self.blob 
      for key, func in kwargs.items():
          for i in range(len(data)):
              data[i][key] = func(data[i])
      return Clumper(data)

We can now perform commands like;

(Clumper(poke_dict)
  .keep(lambda d: 'Grass' in d['type'],
        lambda d: d['hp'] < 60)
  .select('name', 'hp')
  .mutate(hp = lambda d: d['hp'] * 2,
          hp4 = lambda d: d['hp'] * 4)
  .blob)

Again, notice how flexible we now are because we can chain these commands together.