Swap two objects in python

Swapping the contents of two objects in python is so simple you wouldn’t believe.

// yes, it's as simple as reassigning them.
a,b = b,a

So how does this work?
1. First, the right-hand side b,a is evaluated: this means a tuple of two elements is created in memory. The two elements are the objects designated by the identifiers b and a, that existed before the instruction was encountered.

After the creation of this tuple, no assignments of this tuple object have been made yet.

2. Then, the left-hand side is evaluated: this means the tuple is assigned to the left-hand side. Since the left-hand side is composed of two identifiers, the tuple is unpacked in order to assign the first identifier a to the first element of the tuple (the object that was formerly b before the swap) and the second identifier b is assigned to the second element of the tuple (the object that was formerly a before the swap).
This mechanism has effectively swapped the objects assigned to the identifiers a and b.

Quick and Dirty – Indexing Numpy Arrays

Working with arrays can be a bit confusing to begin with. Here’s a quick and dirty array indexing guide to make sure you never get confused.

test = np.array([[ 0, 1, 2, 3, 4],
 [ 5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14]])

Select the third row (row #2):

print test[2]

>> [10 11 12 13 14]

Select row 0 and 1:

print test[:2]

>> [[0 1 2 3 4]
 [5 6 7 8 9]]

Select the last row:

print test[-1]

>> [10 11 12 13 14]

Select column 2:

print test[:,2]

>> [ 2  7 12]
Select elements 0 and 1 in column 2:
print test [0:2, 2]

>> [2 7]

Copying numpy arrays vs. copying lists

Today’s daily pitfall celebrates array copying. In a previous post, we talked about copying lists. If you’re using a numpy array (ndarray), however, the correct way to do it is using numpy’s convenient copy function.

import numpy as np
new_ndarray = np.copy(old_ndarray)

If you try using standard list copying methods – it won’t work, but Python won’t throw an exception, either. Took 30 minutes of algorithm debugging mixed in with a healthy dose of profanity before I tracked down the problem.

new_ndarray = old_ndarray[:]  # please don't do this

Django Template Error – Reverse Template Not Found

Running into a strange django error:

“Reverse for ” with arguments ‘()’ and keyword arguments ‘{}’ not found. ”

This error appeared mysteriously when porting a working project from one computer to another. The first computer was running Python 2.7.1, the second – Python 2.7.2. All other project settings were identical.

For the original computer (Python 2.7.1), the following settings:

<a href="{% url 'display_rulelist' %}"><span class="numbertxt"> Rule List </span>


url(r'^rulelist/$', rulelist.views.display_rulelist,  name = 'display_rulelist')

worked correctly, with no errors. These did NOT work for Python 2.7.2!

For the new computer (Python 2.7.2),

<a href="{% url display_rulelist %}"><span class="numbertxt"> Rule List </span>

removing the apostrophes solved the problem.

I tried going back to the first version and removing the apostrophes as well, but after making the change – the first project no longer worked.

All I can recommend: when running into this error, try both versions!


It was pointed out to me (see comments below) that the url formatting was updated between django 1.4.x and django 1.5. I had completely overlooked that the django versions were different, but so they were: the first project had run django 1.5, and the second: django 1.4.3. Beware of old django versions, users-who-work-on-more than one computer! BEWAAAARE!

Adding CSS templates to Django – A Tutorial for Dummies

I have seen a lot of pages and stackoverflow questions that just want to know… how in hell do I get a CSS template to work with Django, even on a basic level? I found the official documentation for Django static files a bit confusing. So I’ve laid out the steps here, along with some basic tips. This will work for offline development scenarios – I haven’t deployed my project on a *real* server yet. 😉

Without further ado, here we go:

  1. The default location for your static files (CSS style sheets, images) is per app: for each app, create a static subdirectory, and put all your static files there. These apps need to be listed in your INSTALLED APPS setting.
  2. Place your statics files in the appropriate directory. Here the *.css files for app books are located in the static subdirectory, and the images are located in a dedicated images subdirectory within .
  3. Directory Structure

  4. Add django.contrib.staticfiles to your INSTALLED_APPS, in your settings.py file (if it isn’t there already).
  6. If necessary, add explicit local paths to STATICFILES_DIRS in settings.py
  7. # URL prefix for static files.
    # Example: "http://example.com/static/", "http://static.example.com/"
    STATIC_URL = '/static/'
    # Additional locations of static files
        # Put strings here, like "/home/html/static" or "C:/www/django/static".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.
  8. When you refer to the files in your templates, you will use the tag {{ STATIC_URL }}. Examples for a CSS stylesheet and an image:
    Display Authors
        	<link href="{{ STATIC_URL }}style1.css" rel="stylesheet" type="text/css" />
    <img alt="" src="{{ STATIC_URL }}images/photo.jpg" />
  10. As shown above, CSS tags are placed below the title tag.
  11. This should work now. Good luck!

Django Book Tutorial doesn’t work – CSRF error


If you’ve been working your way through the Django Book tutorial, you may have run into a spot of trouble with the form chapter. Even though I had basically cut and pasted in the chapter code, I kept getting a CSRF Verification Failed error, which was definitely not listed in the book.

We don't like this.

We don’t like this.

CSRF stands for Cross Site Request Forgery, which is a type of attack on your web page. This occurs when a malicious Web site contains a link, a form button or some javascript that is intended to perform some action on your Web site, using the credentials of a logged-in user who visits the malicious site in their browser. CSRF protection in Django is meant to prevent just that, which is why we get an error if we haven’t properly secured our forms. It seems to have been enforced in newer versions of Django, but still not updated in the online book.

The problem can be solved as follows:

  1. Add the middleware 'django.middleware.csrf.CsrfViewMiddleware' to your list of middleware classes, MIDDLEWARE_CLASSES.
  2. In any template that uses a POST form, use the csrf_token tag inside the html.
    <form action="" method="post">
        	{% csrf_token %}
                {{ form.as_table }}
            <input type="submit" value="Submit">
  3.  Instead of using a context in your forms, use a RequestContext in views.py. The code looks like this:
from django.template import RequestContext
def contact(request):
    initialData = {'form': form}
    return render_to_response('contact_form.html', initialData,

The RequestContext contains a CSRF token which is necessary to prevent this error. Completing these steps should resolve the problem! 🙂

Checking if Python is 32-bit or 64-bit version

I keep forgetting this one, but it comes in really handy to track versions. It was especially handy 2 days ago, when the Orange installation silently overwrote my 64-bit Python with a 32-bit version. Sigh.

import platform

OMG! 64-bit versions of best scientific Python libraries!

This page is the answer to all my dreams come true. Well, some of them, anyway.

32 and 64-bit versions of scientific open-source Python libraries, for Python 2.6 and Python 2.7! Saved me from a 64-bit Orange disaster.

Unofficial Windows Binaries for Python Extension Packages

Working with Python behind a proxy server

If you’re working behind a proxy server, you may run into some unexpected issues when configuring a work environment with Python and Eclipse. Here are some quick fixes:

Configuring the proxy server in Eclipse:

  1. Window -> Preferences -> General -> Network Settings.
  2. Set the Active Provider drop-down box to Manual.
  3. Edit the HTTP entry in the Proxy Settings list.
  4. Fill in the proxy server and port number (user name and password if necessary).
  5. And here’s MKYong’s long version, with screenshots!


Configuring the proxy server for other tasks, like easy_install:

Set an environmental variable:

set http_proxy=http://user:some%20long%20password@webproxy.mycompany.com:80

(The %20‘s are only needed if you happen to have spaces in your password.)


Configuring PyDev in Eclipse to work with Django

The pre-requisite for working with Django is that it is installed in the Python interpreter you want to use.

Eclipse will add the Django options to the menu automatically. At this point, you can:

  1.  create a new Django project: Ctrl+N > PyDev Django Project
  2.  change an existing project to Django: right-click the project and choose
    PyDev -> Set as Django Project.
  3. (you can also change projects back in the same way).

In order to compile and run the web server, use the standard CTRL-F11.

  1. Don’t forget to add runserver to the Run Configuration
  2. Add –noreload as well so you can see the console output.

You can find a complete tutorial here.