Use __main__.py

We have all seen the __init__.py file and know its role, but what is __main__.py? I have seen many Python projects either on Github or at work that do not take advantage of this magic file. In my opinion, including a __main__.py is a better way to interface with multi-file python modules.

But first some background: How do most people run their Python programs?

Occasionally you will write a program that is organized enough so that it can both be imported as a module to another program or run by itself through a command line interface. In this case, you are probably familiar with the following lines commonly placed at the bottom of the file:

if __name__ == '__main__':
    main(sys.argv)

When you run a program by calling the Python interpreter on it, the magic global variable __name__ gets set to __main__. We can use that to know that we are not being imported as a module, but ran. For example:

python myapp.py

This works just fine for single file projects.

The problem

If you are like me, you do not want your entire application in a single python file. Separating related logic out into their own files makes for easier editing and maintainability. For example:

.
├── README.me
├── requirements.txt
├── setup.py
└── src
    ├── __init__.py
    ├── client.py
    ├── logic.py
    ├── models.py
    └── run.py

But then this raises confusion to a user who just downloaded your program. Which one is the main file? Is it run.py? Or maybe client.py? What file has my precious if __name__ == ‘__main__’ statement? This is where we can get a lot of value from __main__.py.

__main__.py

The magic file __main__.py is called when you run your project with the -m module flag. If you code is intended to be used a module first, and command line interface second, this makes perfect sense to use. Think of it as a place we can put whatever would be in our body of our if __name__ == __main__ statement. Refactoring the project above to conform:

.
├── README.me
├── requirements.txt
├── setup.py
└── myapp
    ├── __init__.py
    ├── __main__.py
    ├── client.py
    ├── logic.py
    ├── models.py

And now we just run it as a module not a singleton program.

python -m myapp

__main__.py will auto-magically be executed. This is a perfect place to put a command line interface and handle program arguments!

Good luck and happy hacking!

My Python VS Code Setup

If you are like me, you have dropped your other editors and IDEs for VS Code. I have been using VS Code as my primary editor for about a year now. My goal is to balance the bare minimum with the most efficient plugins. The last thing we want to do is turn VS Code into Intellij, right? Here are my top plugins and configurations.

Python

This plugin is essential. It provides a plethora of features for working with Python files. If you have ever worked with Python in VS Code you probably already have it installed!

ImportMagic

This is a plugin whose features I think will eventually be part of VS Code core. I do not like typing imports manually as there is a lot of room for error. Let’s be honest, no one can remember in which module the class you want to instantiate is in. For those of you coming from PyCharm/Intellij, you will be missing your auto-imports until you install this one.

autoDocstring

Probably the most underrated of the Python plugins — autoDocstring makes writing doc strings a breeze, and who doesn’t like docstrings? It is configurable for all the most popular docstring formats like Google, Sphinx, and others.

SQLite

SQLite – everyone’s favorite database. It deserves a proper database viewer inside VS Code. This plugin is very lightweight and is great to have when working on your Django apps.

Vim

This one is totally preference! I like editing using vim keybinds. I feel like I have more control, and its easier to navigate files. However, if you have never used Vim before, then take some time to learn about it and try it out somewhere else before bringing it into your editor. However, I must add that I often toggle Vim off in VS Code when I want, and then turn it back on when I am ready to start coding.

Gitlens

Not unique for Python development, but all of my Python code is checked into Git making this a no-brainer choice. Some people like to turn off the Blame features because they feel as if it clutters the file. I personally do not mind them, but to each their own.

Atom One Dark Theme

The one thing that Atom is unquestionably better than VS Code at is it’s dark theme. This theme is so nice on the eyes. Personally, I think it’s the best color scheme and I hope that all of the software that I use incorporates these dark pastel shades in one form or another.

Django

A must-have for Django developers out there. It is especially useful if you do any server side rendering using Django templates, or even Email templates. It will provide syntax highlighting and snippets. Add a rule to your settings, or Ctrl + K M and select Django-html.

Settings

I like to keep my settings pretty lean, but there are also a few essential flags to set to make your life much easier! Here are some I like:

{
  "editor.formatOnSave": true,
  "editor.minimap.enabled": false,
  "files.autoSave": "afterDelay",
  "files.autoSaveDelay": 500,
  "autoDocstring.docstringFormat": "google",
  "editor.snippetSuggestions": "top"
  "files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/**": true,
    "**/.direnv/**": true,
    "**/.venv/**": true
  }
}

Thanks for reading! And happy hacking!

Effective Python API testing using Django and Patch

Today I would like to offer a brief showcase on how to effectively test a Django API. Essentially, what we want to accomplish is the ability to test and control how our applications handle specific responses from external web APIs. A program might make calls to several different APIs like Reddit’s or Google’s, and we want to capture these responses under test. More importantly, in a way that our tests can pass every time regardless of the status of the APIs we consume.

Continue reading “Effective Python API testing using Django and Patch”

New look!

I redesigned the site as you could probably tell. I moved off of my own homebrewed creation to WordPress because its more in line with my vision, and frankly I don’t have time to develop new features. Happy hacking!