[PATCH 2 of 3 V2] py3: utility functions to convert keys of kwargs to bytes/unicodes

Pulkit Goyal 7895pulkit at gmail.com
Wed Dec 7 13:43:31 EST 2016


This is V1 sandwiched between two V2 patches. I found no better way to
send the series.

On Thu, Dec 8, 2016 at 12:06 AM, Pulkit Goyal <7895pulkit at gmail.com> wrote:
> # HG changeset patch
> # User Pulkit Goyal <7895pulkit at gmail.com>
> # Date 1481127783 -19800
> #      Wed Dec 07 21:53:03 2016 +0530
> # Node ID 85d610c83bda09dea2393c22e415dd9656f5a7f2
> # Parent  ced854b9dfaa7298b241ac085627b12ecb796dcd
> py3: utility functions to convert keys of kwargs to bytes/unicodes
>
> Keys of keyword arguments need to be str(unicodes) on Python 3. We have a lot
> of function where we pass keyword arguments. Having utility functions to help
> converting keys to unicodes before passing and convert back them to bytes once
> passed into the function will be helpful. We now have functions named
> pycompat.strkwargs(dic) and pycompat.byteskwargs(dic) to help us.
>
> diff -r ced854b9dfaa -r 85d610c83bda mercurial/pycompat.py
> --- a/mercurial/pycompat.py     Tue Dec 06 06:36:36 2016 +0530
> +++ b/mercurial/pycompat.py     Wed Dec 07 21:53:03 2016 +0530
> @@ -103,6 +103,22 @@
>          args = [a.encode('latin-1') for a in args]
>          return opts, args
>
> +    # keys of keyword arguments in Python need to be strings which are unicodes
> +    # Python 3. This function take keyword arguments, convert the keys to str
> +    # if they are in bytes.
> +    def strkwargs(dic):
> +        dic = {(k.decode('latin-1') if isinstance(k, bytes) else k): v
> +                                                    for k, v in dic.items()}
> +        return dic
> +
> +    # keys of keyword arguments need to be unicode while passing into a
> +    # a function. This function helps us to convert those keys back to bytes
> +    # again as we need to deal with bytes.
> +    def byteskwargs(dic):
> +        dic = {(k.encode('latin-1') if isinstance(k, str) else k): v
> +                                                    for k, v in dic.items()}
> +        return dic
> +
>  else:
>      def sysstr(s):
>          return s
> @@ -125,6 +141,12 @@
>      def getoptb(args, shortlist, namelist):
>          return getopt.getopt(args, shortlist, namelist)
>
> +    def strkwargs(dic):
> +        return dic
> +
> +    def byteskwargs(dic):
> +        return dic
> +
>      osname = os.name
>      ospathsep = os.pathsep
>      ossep = os.sep


More information about the Mercurial-devel mailing list