Opened 10 years ago

Last modified 2 years ago

#23919 closed Cleanup/optimization

Cleanups for when we drop Python 2 compatibility — at Version 46

Reported by: Tim Graham Owned by: nobody
Component: Core (Other) Version:
Severity: Normal Keywords:
Cc: cmawebsite@…, Tom Forbes Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Simon Charette)

This is a tracking ticket of things that we can remove when we drop Python 2 compatibility in Django 2.0. Please edit the description of the ticket as you come across new items.

  • django.core.mail.message.make_msgid() #23905
  • django.dispatch.weakref_backports
  • django.http.cookie workarounds
  • django.utils.2to3_fixes
  • django.utils.decorators.ContextDecorator
  • django.utils.encoding
    • @python_2_unicode_compatible
    • force/smart _unicode
    • either force/smart _text or force/smart _str
  • django.utils.html_parser.use_workaround
  • django.utils.http functions like urlquote_plus -- I think the versions of these functions on Python 3 don't have the unicode characters bug we are working around.
  • Stop using django.utils.lru_cache
  • Figure the deprecation plan for django.utils.lru_cache
  • django.utils.six - Remaining: PR 7878
  • from __future__ import unicode_literals
  • str() stuff for environment variables, e.g. 0bfb53866199f366ed140d49938fd185e5898156
  • Inheriting from object in django.core.servers.basehttp (and perhaps other places) ala 4ee06ec3fc8e94d164afbd2f9c880c60c658a9ac
  • git grep 'long int' (mostly docs)
  • django.utils._os [npath,upath]
  • In tests: contextlib.closing(self.urlopen (contextlib.closing no longer needed)
  • Support for pysqlite (doesn't support Python 3)
  • Replace super(ClassName, self) with super()
  • Remove # -*- coding: utf-8 -*- source file encoding (that's the default on Python 3)
  • Evaluate replacement of custom __del__ methods by weakref.finalize
  • Remove __ne__ from objects already defining a __eq__
  • Remove note about PYTHONHASHSEED (see #26243)
  • Remove Field.creation_counter (replace by metaclass __prepare__ returning OrderedDict(), https://docs.python.org/3/reference/datamodel.html#preparing-the-class-namespace)
  • django.test.utils.reset_warning_registry()
  • Replace errno checks by IOError subclasses defined by PEP 3151
  • django.utils.glob
  • django.utils.cookies.SimpleCookie
  • django.test.mock
  • Replace tempfile.mkdtemp + remove with tempfile.TemporaryDirectory context manager
  • Replace io.open() by a plain open()
  • Evaluate need for assertRegex, assertRaisesRegex in tests. Some usage is merely to account for differences in messages between Python 2 and 3.
  • re.U, re.UNICODE (default behavior of Python 3) - PR 7879

Change History (46)

comment:1 by Wojtek Ruszczewski, 10 years ago

Various nonlocal workarounds (example).

comment:2 by Collin Anderson, 10 years ago

Description: modified (diff)

comment:3 by Tim Graham, 10 years ago

Description: modified (diff)

comment:4 by Anssi Kääriäinen, 10 years ago

I believe we can get rid of the Field.creation_counter hack. In Python 3 it is possible to store the attrs in a sorted dictionary. See http://stackoverflow.com/questions/4459531/how-to-read-class-attributes-in-the-same-order-as-declared.

comment:5 by Collin Anderson, 10 years ago

Description: modified (diff)

comment:6 by Tim Graham, 10 years ago

Description: modified (diff)

comment:7 by Tim Graham, 10 years ago

Description: modified (diff)

comment:8 by Collin Anderson, 10 years ago

Cc: cmawebsite@… added
Description: modified (diff)

comment:9 by Collin Anderson, 10 years ago

Description: modified (diff)

comment:10 by Curtis Maloney, 10 years ago

In far too many tests we rely on the fact six aliases builtins [like input] instead of using mock.

I submitted a patch recently to clean up a couple of these I found, but I am finding more.

comment:11 by Curtis Maloney, 10 years ago

Description: modified (diff)

comment:12 by Tim Graham, 9 years ago

Description: modified (diff)

comment:13 by Tim Graham, 9 years ago

Description: modified (diff)

comment:14 by Moritz Sichert, 9 years ago

Description: modified (diff)

comment:15 by Tim Graham, 9 years ago

Description: modified (diff)

comment:16 by Claude Paroz, 9 years ago

Description: modified (diff)

comment:17 by Simon Charette, 9 years ago

Description: modified (diff)

comment:18 by Collin Anderson, 9 years ago

Description: modified (diff)

comment:19 by Anssi Kääriäinen, 9 years ago

Description: modified (diff)

comment:20 by Tim Graham, 9 years ago

Description: modified (diff)

comment:21 by Jon Dufresne, 8 years ago

Description: modified (diff)

comment:22 by Curtis Maloney, 8 years ago

Description: modified (diff)

comment:23 by Curtis Maloney, 8 years ago

Description: modified (diff)

comment:24 by Jon Dufresne, 8 years ago

Description: modified (diff)

comment:25 by Claude Paroz, 8 years ago

Description: modified (diff)

comment:26 by Tim Graham, 8 years ago

Description: modified (diff)

comment:27 by Tim Graham, 8 years ago

Description: modified (diff)

comment:28 by Claude Paroz, 8 years ago

Note that I have a local branch which does some boring removals (unicode_literals, utf-8 preambles, some six usage). So ping me as soon as the Django 2.0 deprecated stuff is removed and I'll offer a patch for that.

comment:29 by Asif Saifuddin Auvi, 8 years ago

I am also working to remove python2 workarounds by following a module by module approach.

comment:30 by Aymeric Augustin, 8 years ago

If Claude has already prepared these changes, perhaps you should wait for his patch instead of duplicating his work?

in reply to:  30 comment:31 by Asif Saifuddin Auvi, 8 years ago

Replying to Aymeric Augustin:

If Claude has already prepared these changes, perhaps you should wait for his patch instead of duplicating his work?

Yes I talked with Claude on IRC to pause before his work is merged.

in reply to:  4 comment:32 by Josh Smeaton, 8 years ago

Replying to Anssi Kääriäinen:

I believe we can get rid of the Field.creation_counter hack. In Python 3 it is possible to store the attrs in a sorted dictionary. See http://stackoverflow.com/questions/4459531/how-to-read-class-attributes-in-the-same-order-as-declared.

We could also remove this when we support python 3.6, as class attributes retain their order. I'm guessing this is a consequence (or the cause of) dictionaries retaining insertion order. https://docs.python.org/3.6/whatsnew/3.6.html#pep-520-preserving-class-attribute-definition-order

comment:33 by Claude Paroz <claude@…>, 8 years ago

In d7b9aaa:

Refs #23919 -- Removed encoding preambles and future imports

comment:34 by Claude Paroz <claude@…>, 8 years ago

In f3c43ad:

Refs #23919 -- Removed python_2_unicode_compatible decorator usage

comment:35 by Tim Graham, 8 years ago

Triage Stage: Someday/MaybeAccepted

PR for removing Python 2 references from docs.

comment:36 by Claude Paroz <claude@…>, 8 years ago

In c716fe87:

Refs #23919 -- Removed six.PY2/PY3 usage

Thanks Tim Graham for the review.

comment:37 by GitHub <noreply@…>, 8 years ago

In f6acd1d:

Refs #23919 -- Removed Python 2 notes in docs.

comment:38 by Claude Paroz <claude@…>, 8 years ago

In 7b2f2e74:

Refs #23919 -- Removed six.<various>_types usage

Thanks Tim Graham and Simon Charette for the reviews.

comment:39 by Claude Paroz <claude@…>, 8 years ago

In 2b281cc3:

Refs #23919 -- Removed most of remaining six usage

Thanks Tim Graham for the review.

comment:40 by Aymeric Augustin, 8 years ago

Description: modified (diff)

comment:41 by Claude Paroz, 8 years ago

Description: modified (diff)

comment:42 by Mariusz Felisiak, 8 years ago

Description: modified (diff)

comment:43 by Tim Graham <timograham@…>, 8 years ago

In 3cc5f01d:

Refs #23919 -- Stopped using django.utils.lru_cache().

comment:44 by Tim Graham <timograham@…>, 8 years ago

In eb422e47:

Refs #23919 -- Removed obsolete ne() methods.

ne() defaults to the opposite of eq() on Python 3
when it doesn't return NotImplemented.

comment:45 by Tim Graham <timograham@…>, 8 years ago

In a5563963:

Refs #23919 -- Replaced io.open() with open().

io.open() is an alias for open() on Python 3.

comment:46 by Simon Charette, 8 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top