Calmcode - setup: introduction

Introduction

1 2 3 4 5 6 7 8 9

We're starting an open source project on behalf of this website! In this series of video's well set up the project locally, turn our python code into a python project and also make the first version of it pip-installable.

The goal of this project (named Clumper) will be to offer tools that make it easier to deal with long lists of dictionaries/json-like objects. The API will look something like this;

from clumper import Clumper

list_of_dicts = [
  {'date': '2014-01-01', 'values': [1, 2, 3]},
  {'date': '2014-01-02', 'values': [1, 2, 3, 4]},
  ...
]

(Clumper(list_of_dicts)
  .keep(lambda d: d['date'] == '2014-01-01')
  .mutate(sum_values=lambda d: sum(d['values'])))

This code will take our list of dictionaries, grab all the instances where the date is equal to 2014-01-01 and for those instances add a key called sum_values to is equal to the sum of the values list in each of those dictionaries. The code that might do this looks like this:

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)

    def sort(self, key, reverse=False):
        return Clumper(sorted(self.blob, key=key, reverse=reverse))

Note that this is the code that we start with and it is the exact same code as what we ended with in our videos on method chains. We'll add more and more features to this class but in this series of videos we'll focus on getting a project set up where we might work in.