Python Development 101


2013-05-01 · 5 min read

This article explains in a nutshell how to get start with developing applications in Python. It gives a brief overview of the language and its ecosystem along with a practical, hands-on tutorial.

Language

Python is a dynamic, strongly typed programming language. Dynamic means that type checking is performed at run-time. Strongly typed, in context of Python, means that there is very little implicit type conversion. In particular, expressions such as '1' + 1 or [1] - 1 will raise TypeError exception; equality operator is also strict e.g. {} == [] or "" == {} will evaluate to False.

Everything is an object, including data types. None is a value used to denote the absence of value and it is also an object. For more information, check Python on Wikipedia

Python comes with an interactive programming environment (REPL), but IPython (an enhanced Interactive Python) is much better alternative.

λ pip install IPython
λ ipython

help(object) provides a documentation for each object (including functions which are objects as well).

For string interpolation a .format() based syntax is recommended, instead of old, printf-style formatting.

# Recommended
"Simple {} and a float {:.2f}, large number {:,}".format('phrase', 34.2234, 1000000)

# Deprecated
"Simple %s and a float %.2f, large number %d" % ('phrase', 34.2234, 1000000)

=> 'Simple phrase and a float 34.22, large number 1,000,000'

Instead of using if statement to check if an action is valid, it is more pythonic to use exception-based flow and wrap a given block of code in try/except statement.

List comprehensions should be prefered over map and filter functions.

Some of Python 3 improvements can be enabled in Python 2 by adding the following import at the top of your files:

from __future__ import absolute_import, division, print_function,
unicode_literals

Be sure to check Code like a Pythonista: Idiomatic Python and Filesystem structure of a Python project.

Ecosystem

PyPI (Python Package Index) is a software repository of third-party, open-source libraries. It is similar to RubyGems for Ruby, NPM for Node.js or CPAN for Perl.

pip is tool for installing packages from the PyPI. ease_install is pip predecessor. It is a common practice to use pip instead of easy_install because it provides better package management: not only installing, but also uninstalling packages, resolving dependencies for a package and specifying project's dependencies with requirements.txt. Unlike Ruby's bundler, pip cannot manage different versions of the same library: installing globally overrides its previous version.

To counter last problem, Python uses virtual environments. virtualenv is a tool which isolates dependencies for each project by creating a special directory only with packages needed by the project and in specific versions. This way it is easier to work on more than one project at a time without introducing conflicts in their dependencies. Each virtual environment provides a copy of Python and pip binaries. Python 3.3 supports virtual environments out of the box: it is accessible with pyenv command.

Global Setup

Install Python, on OSX with:

λ brew install python

on Ubuntu with:

λ apt-get install python python-pip python-dev

Note these commands install pip globally which is not recommended, but I find it easier.

Install virtualenv:

λ pip install virtualenv

Per-Project Setup

Create a project directory:

λ mkdir morelia
λ cd morelia

Activate a virtual environment for newly created project. A common convention is to call this directory env or venv:

λ virtualenv venv
New python executable in venv/bin/python
Installing setuptools............done.
Installing pip............…done.

Code is located at /path/to/morelia and its environment at /path/to/morelia/venv. venv shouldn't be committed to the repository. Add it to your .gitignore or .hgignore. Let's list virtual environment directory:

λ ls venv
bin include lib

bin/ contains a local copy of Python binary along with pip.

Activate the environment:

λ source venv/bin/activate

Check if Python and pip binaries are correctly referenced:

λ which python
/path/to/morelia/venv/bin/python
λ which pip
/path/to/morelia/venv/bin/pip

Note Python 3.3 comes with virtualenv by default. You can create a virtual environment in current directory by executing:

λ pyvenv venv

Install a package from PyPI to this project virtual environment:

λ pip install pyramid

Or install a package in a specific version:

λ pip install pyramid==1.0

Other useful, self-explanatory commands:

λ pip show --files pyramid
λ pip list --outdated
λ pip install --upgrade pyramid
λ pip uninstall pyramid

Each project may have a requirements.txt that specifies project dependencies. They can be installed via

λ pip install -r requirements.txt

More about requirement files.

Extras

virtualenvwrapper

virtualenvwrapper is a virtualenv extension which helps organise virtual environments: instead of putting each of them inside project directory, it organises them all in one place and it adds wrappers to make management easier along with hook actions.

Install virtualenvwrapper with pip:

λ pip install virtualenvwrapper

I like keeping virtual environments in ~/.virtualenvs which is default location. If you prefer a different one, it can be configured via WORKON_HOME shell variable.

Add one of following lines to your .zshrc or .bashrc depending on your OS.

source '/usr/local/share/python/virtualenvwrapper.sh'  # OSX, Python installed with Homebrew
source /usr/local/bin/virtualenvwrapper.sh  # Ubuntu, Python installed with apt-get

Additionally, set the VIRTUALENVWRAPPER_VIRTUALENV_ARGS to --no-site-packages to ensure that all new environments are isolated from the system site-packages directory.

Create a virtual environment:

λ mkvirtualenv morelia
New python executable in morelia/bin/python
Installing setuptools............done.
Installing pip...............done.
(morelia) λ

It automatically activates this virtual environment as well.

Deactivate current virtual environment:

(morelia) λ deactivate
λ

Choose from existing virtual environments:

λ workon
morelia
test
λ workon morelia
(morelia) λ

Check this short screencast that goes through almost all virtualenvwrapper features. If you use oh-my-zsh, there is a nifty virtualenvwrapper plugin that adds virtual environment names completion.

Python 3 Installation

On OSX, using Hombrew:

λ brew install python3

On any modern OS, from source:

curl -O http://python.org/ftp/python/3.3.0/Python-3.3.0.tar.bz2
tar jxf ./Python-3.3.0.tar.bz2
cd ./Python-3.3.0
./configure --prefix=/opt/python3.3
make && sudo make install

On any modern OS, using pythonz, a Python installation manager which automates the process of building and installing Python versions, similar to Ruby's rvm or rbenv + ruby-build. It supports CPython, Stackless, PyPy and Jython.

Install pythonz:

λ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash

Add this line to your .bashrc or .zshrc:

[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc

Start new terminal and install desired Python version:

λ pythonz install 3.3.1

For more information about available commands, check pythonz help

λ pythonz help