Understanding Object-Oriented Programming with Assert
Tags: datascience, machinelearning, python
Published: 2020-10-31 14:05:35

## Assert

#### Automated Testing and Assert

One of the many cool things about Data Science from Scratch (by Joel Grus) is his use of assertions as a way to "test" code. This is a software engineering practice (see [test-driven development](https://en.wikipedia.org/wiki/Test-driven_development)) that may not be as pervasive in data science, but I suspect, will see [growth in usage](https://www.kdnuggets.com/2020/08/unit-test-data-pipeline-thank-yourself-later.html) and will soon become best practice, if we're not [already there](https://www.datacamp.com/courses/unit-testing-for-data-science-in-python). 

While there are testing frameworks that deserve their own chapters, throughout *this* book, fortunately the author has provided a simple way to test by way of the `assert` key word, here's an example:

```python
# create function to return the largest value in a list
def largest_item(x):
    return max(x)
    
# assert that our function is working properly
# we will see 'nothing' if things are working properly
assert largest_item([10, 20, 5, 40, 99]) == 99

# an AssertionError will pop up if any other value is used
assert largest_item([10, 20, 5, 40, 99]) == 40
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-21-12dc291d091e> in <module>
----> 1 assert largest_item([10, 20, 5, 40, 99]) == 40

# we can also create an assertion for input values
def largest_item(x):
    assert x, "empty list has no largest value"
    return max(x)
```

## Object-Oriented_Programming

Object-oriented programming could be it's own chapter, so we won't try to shoot for comprehensiveness here. Instead, we'll try to understand it's basics and the `assert` function is going to help us understand it even better. 

First, we'll create a **class** `CountingClicker` that initializes at count 0, has several methods including a `click` method to increment the count, a `read` method to read the present number of count and a `reset` method to reset the count back to 0.

Then we'll write some `assert` statements to test that our class method is working as intended. 

You'll **note** that there are private methods and public methods. Private methods have the **double underscore** (aka dunder methods), they're generally not called, but python won't stop you. Then we have the more familiar *public* methods. Also, all the methods have to be written **within** the scope of the class `CountingClicker`. 

```python
class CountingClicker:
    """A class can/should have a docstring, just like a function"""
    def __init__(self, count = 0):
        self.count = count
    def __repr__(self):
        return f"CountingClicker(count = {self.count})"
    def click(self, num_times = 1):
        """Click the clicker some number of times."""
        self.count += num_times
    def read(self):
        return self.count
    def reset(self):
        self.count = 0
```

After we've written the class and associated methods, we can write `assert` statements to test them. You'll want to write the below statements **in this order** because we're testing the *behavior* of our `CountingClicker` class. 

```python
clicker = CountingClicker()

assert clicker.read() == 0, "clicker should start with count 0"

clicker.click()

clicker.click()

assert clicker.read() == 2, "after two clicks, clicker should have count of 2"

clicker.reset()

assert clicker.read() == 0, "after reset, clicker should be back to 0"
```
In summary, we created a class `CountingClicker` whose methods allow it to display in text (`__repr__`), `click`, `read` and `reset`.

All these methods belong to the `class` CountingClicker and will be passed along to new instances of classes - we have yet to see what this will look like as it relates to tasks in data science so we'll revisit this post when we have updates on the applied end. 

Then, we tested our class `CountingClicker` with various `assert` statements to see if it behaves as intended. 

___

This is one section of a quick python crash course as conveyed from [Data Science from Scratch](https://joelgrus.com/2019/05/13/data-science-from-scratch-second-edition/) (by Joel Grus), you may be interested in these other posts on:

- [Python List and Numpy Array](https://dev.to/paulapivat/python-list-and-numpy-array-2g9o)
- [defaultdict](https://dev.to/paulapivat/defaultdict-3cio) 
- [Dictionaries](https://dev.to/paulapivat/dictionaries-4423)
- [Virtual Environment set-up](https://dev.to/paulapivat/data-science-from-scratch-intro-setup-46j5)