[PATCH] localrepo: use modern import

Augie Fackler raf at durin42.com
Tue May 5 08:56:51 CDT 2015


On Mon, May 04, 2015 at 09:50:39PM -0700, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc at gmail.com>
> # Date 1430800991 25200
> #      Mon May 04 21:43:11 2015 -0700
> # Branch stable
> # Node ID 6c62247d0b6c111a62281af647028e11504e3fe9
> # Parent  cc497780eaf9c191564c64b40ca549f706c62724
> localrepo: use modern import

I like this (in spirit - I think the syntax is a bit ugly but oh
well), but in talking to mpm yesterday a blocker for dropping 2.4 is
having an automated build that runs 'make docker-centos5' and puts
that package someplace useful for our forsaken friends on centos5.

Once that happens, I've got a big stack that gets test-run-tests.t to
pass on 2.6, 2.7, and 3.5 from a single tree, which I'll want to get
submitted and in a continuous build.

>
> This is a canary patch to test the waters around dropping Python 2.4
> support by introducing the modern import statement, which will make
> Python 3 compatbility easier and increase readability.
>
> Python 3 changes the behavior of "import" to only be absolute. In Python
> 2.x "import foo" could import a top-level package or a module from the
> current package. This resulted in ambiguity when the name of a module
> conflicted with the name of a package.
>
> Python 2.5 introduced the "absolute_import" feature to __future__ to
> enable Python 2.x to import like Python 3. Adopting "absolute_import"
> makes dual compatibility with Python 3 easier to achieve. In my
> opinion, it also makes code easier to read since there is no ambiguity
> as to where a module is coming from. With a project of Mercurial's
> size (~120 .py files), this can be a real concern, especially for
> new contributors.
>
> PEP-0328 also introduced the multiple line import statement. Simply
> add parenthesis and you get more readable import statements. This
> PEP also introduced relative imports ("from . import foo").
>
> This patch switches localrepo.py to use the modern import statement.
> It introduces multiple line imports. It switches imports to relative.
> It enforces the use of absolute imports by using the "absolute_import"
> feature from __future__. While I was here, I also reordered imports:
> standard library first, mercurial second, each alphabetized within its
> subset. This included having one module per line, which is widely
> considered a best practice in the Python community. If this patch is
> accepted, we should probably deploy a linter to enforce that files
> with "absolute_import" use this new standardized import convention.
>
> The choice of relative imports versus absolute imports ("from ." vs
> "from mercurial.") is arbitrary. Relative imports reduce typing.
> They also make it easier to rename a package. They can, however,
> make refactoring difficult. If a module's level changes, it's relative
> imports also typically need to be changed. But we don't use multiple
> layers of modules very much, so it shouldn't be a major concern at this
> time. It is trivial to auto-rewrite the code in the future should we
> wish to change conventions.
>
> Use of multiple line import and "absolute_import" break compatibility
> with Python 2.4. Good riddance.
>
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -3,23 +3,59 @@
>  # Copyright 2005-2007 Matt Mackall <mpm at selenic.com>
>  #
>  # This software may be used and distributed according to the terms of the
>  # GNU General Public License version 2 or any later version.
> -from node import hex, nullid, short
> -from i18n import _
> +
> +from __future__ import absolute_import
> +
> +import errno
> +import inspect
> +import os
> +import time
>  import urllib
> -import peer, changegroup, subrepo, pushkey, obsolete, repoview
> -import changelog, dirstate, filelog, manifest, context, bookmarks, phases
> -import lock as lockmod
> -import transaction, store, encoding, exchange, bundle2
> -import scmutil, util, extensions, hook, error, revset
> -import match as matchmod
> -import merge as mergemod
> -import tags as tagsmod
> -from lock import release
> -import weakref, errno, os, time, inspect
> -import branchmap, pathutil
> -import namespaces
> +import weakref
> +
> +from . import (
> +    bookmarks,
> +    branchmap,
> +    bundle2,
> +    changegroup,
> +    changelog,
> +    context,
> +    dirstate,
> +    encoding,
> +    error,
> +    exchange,
> +    extensions,
> +    filelog,
> +    hook,
> +    lock as lockmod,
> +    manifest,
> +    match as matchmod,
> +    merge as mergemod,
> +    namespaces,
> +    obsolete,
> +    pathutil,
> +    peer,
> +    phases,
> +    pushkey,
> +    repoview,
> +    revset,
> +    scmutil,
> +    store,
> +    subrepo,
> +    tags as tagsmod,
> +    transaction,
> +    util,
> +)
> +from .i18n import _
> +from .lock import release
> +from .node import (
> +    hex,
> +    nullid,
> +    short,
> +)
> +
>  propertycache = util.propertycache
>  filecache = scmutil.filecache
>
>  class repofilecache(filecache):
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list