django/django — pull request #3246 by marco-buttu (2014-09-20 14:50:11+00:00)
Title: Fixed a bug that appears by using the bash autocompletion with Python 3.

My environment is Python 3.4 and Linux Mint 17. When using the django autocompletion, a TAB-completion after a command gives me an exception. For instance, typing a TAB after ``django-admin startproject ``:

$ django-admin startproject Traceback (most recent call last):
...
File ".../django/core/management/__init__.py", line 262, in autocomplete
options = sorted((k, v) for k, v in options if k.startswith(curr))
TypeError: unorderable types: bool() < NoneType()

That happens because at line 225 the ``options`` list is initilized as:

options = [('--help', None)]

and at line 263:

options = sorted((k, v) for k, v in options if k.startswith(curr))

But since ``options`` contains ``--help`` twice, in Python 3 we get an error comparing a ``bool`` with ``None``:

>>> sorted([('foo', True), ('--help', False), ('--help', None)])
Traceback (most recent call last):
...
TypeError: unorderable types: NoneType() < bool()

That obviously does not happen in Python 2. The doctring of ``autocomplete()`` says:

>>> from django.core.management import ManagementUtility
>>> for line in ManagementUtility.autocomplete.__doc__.splitlines()[10:15]:
... print(line)
...

Subcommand options are saved as pairs. A pair consists of
the long option string (e.g. '--exclude') and a boolean
value indicating if the option requires arguments. When printing to
stdout, an equal sign is appended to options which require arguments.

So, how come ``options`` is initialized with the pair ``('--help', None)`` instead of ``('--help', False)``?