Open
Description
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!