Opened 11 years ago
Last modified 11 years ago
#23551 closed Bug
Exception raised when using the bash autocompletion with Python 3 — at Initial Version
| Reported by: | Marco Buttu | Owned by: | nobody |
|---|---|---|---|
| Component: | Utilities | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | marco.buttu@… | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
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)*?