One of the better ways to understand code is to figure out how exactly something runs. And this can be done from the outside to the inside.

So I'm starting with a command line that looks like this:

python3 pol.py timeline

And I open up the Python script and search for a def timeline and there isn't one. Sigh. The module Fire was mentioned to me during conversations with another developer so I do a quick code search for File and, at the very bottom, I find:

if __name__ == '__main__':
    Fire(dict(
        extract = extract_thread,
        timeline = hatebase_timeline,
        count = hatebase_regex,
        proportions = hate_proportions,
        urls = get_urls
    ))
    raise SystemExit

So we've got an if statement which is checking name which I guess is some kind of python special thing because double __ are damn ugly so they must be special to make us notice them. The colon seems to indicate that the next bit of code is attached to the if (I do know that it does; explaining it helps me at least). And then we get to the Fire statement which is defining a dict, which I assume is a hash, so that the keyword timeline is mapped to 'hatebase_timeline' which is a method inside this. And if nothing in the dict is matched, I assume that it falls thru to "raise SystemExit" which causes the program to terminate.

The nice thing about Fire is that it seems to automagically handle things like the user giving the wrong input. Here's an example:

python3 pol.py foo
ERROR: Cannot find key: foo
Usage: pol.py <command>
  available commands:    extract | timeline | count | proportions | urls

For detailed information on this command, run:
  pol.py --help

It also handles generating help quite nicely when you omit an argument:

python3 pol.py

NAME
    pol.py

SYNOPSIS
    pol.py COMMAND

COMMANDS
    COMMAND is one of the following:

... (I omitted the specific help)

To use fire, all you need to do is have an import statement (and a line in requirements.txt):

FILE: requirements.txt
fire==0.2.1


FILE: pol.py
from fire import Fire

Python's Fire library comes from Google and is on github. Recommended.

So What Did I Learn?

What I learned from this:

  • A __ is something special in python
  • A : handles assigning code to a label or structure
  • Fire makes command line interfaces
  • The execution order of a python script is likely top down and, I suspect, that this wouldn't have worked if the if statement was at the top because the methods wouldn't have yet been in memory (I'm unclear on this final point)
  • There is an implicit C like concept of main only it is called main and is simply code not inside a def structure