diff -r 1043cc2cb0ff Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py Sat Sep 07 15:24:01 2013 +0300 +++ b/Lib/test/test_urllib.py Sun Sep 15 23:24:37 2013 +0300 @@ -1068,11 +1068,11 @@ def test_nonstring_values(self): self.assertEqual("a=1", urllib.parse.urlencode({"a": 1})) - self.assertEqual("a=None", urllib.parse.urlencode({"a": None})) + self.assertEqual("a", urllib.parse.urlencode({"a": None})) def test_nonstring_seq_values(self): self.assertEqual("a=1&a=2", urllib.parse.urlencode({"a": [1, 2]}, True)) - self.assertEqual("a=None&a=a", + self.assertEqual("a&a=a", urllib.parse.urlencode({"a": [None, "a"]}, True)) data = collections.OrderedDict([("a", 1), ("b", 1)]) self.assertEqual("a=a&a=b", diff -r 1043cc2cb0ff Lib/urllib/parse.py --- a/Lib/urllib/parse.py Sat Sep 07 15:24:01 2013 +0300 +++ b/Lib/urllib/parse.py Sun Sep 15 23:24:37 2013 +0300 @@ -768,12 +768,15 @@ k = quote_plus(k, safe) else: k = quote_plus(str(k), safe, encoding, errors) - - if isinstance(v, bytes): - v = quote_plus(v, safe) + + if v is None: + l.append(k) else: - v = quote_plus(str(v), safe, encoding, errors) - l.append(k + '=' + v) + if isinstance(v, bytes): + v = quote_plus(v, safe) + else: + v = quote_plus(str(v), safe, encoding, errors) + l.append(k + '=' + v) else: for k, v in query: if isinstance(k, bytes): @@ -798,6 +801,10 @@ else: # loop over the sequence for elt in v: + if elt is None: + l.append(k) + continue + if isinstance(elt, bytes): elt = quote_plus(elt, safe) else: