Skip to content

future.backports.urllib.parse.urlunsplit breaks with mixed unicode and str inputs #273

Open
@rclmenezes

Description

@rclmenezes

In Python 2's urlparse.urlunsplit, you can mix unicode and str:

> from urlparse import urlunsplit
> urlunsplit((u'scheme', 'netloc', 'url', 'query', 'fragment'))
u'scheme://netloc/url?query#fragment'

However, future.backports.urllib.parse.urlunsplit breaks with this input:

> from future.backports.urllib.parse import urlunsplit
> urlunsplit((u'scheme', 'netloc', 'url', 'query', 'fragment'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/future/backports/urllib/parse.py", line 399, in urlunsplit
    _coerce_args(*components))
  File "/usr/local/lib/python2.7/dist-packages/future/backports/urllib/parse.py", line 115, in _coerce_args
    raise TypeError("Cannot mix str and non-str arguments")
TypeError: Cannot mix str and non-str arguments

This causes standard_library.install_aliases() to break several popular libraries that use urllib.parse.urlunsplit, like kombu.

It seems that the problem is the _coerce_args function:

def _coerce_args(*args):
    # Invokes decode if necessary to create str args
    # and returns the coerced inputs along with
    # an appropriate result coercion function
    #   - noop for str inputs
    #   - encoding function otherwise
    str_input = isinstance(args[0], str)
    for arg in args[1:]:
        # We special-case the empty string to support the
        # "scheme=''" default argument to some functions
        if arg and isinstance(arg, str) != str_input:
            raise TypeError("Cannot mix str and non-str arguments")
    if str_input:
        return args + (_noop,)
    return _decode_args(args) + (_encode_result,)

I'm new to making Python3 compatible code. Can we simply replace isinstance(args[0], str) withh isinstance(args[0], str) or isinstance(args[0], unicode)? That worked for me when I monkey-patched _coerce_args. I can make a PR if you want.

Thanks!

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions