diff -r 3b4d00e20694 Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst Mon Dec 19 22:05:46 2016 +0800 +++ b/Doc/library/stdtypes.rst Mon Dec 19 09:56:38 2016 -0600 @@ -2314,11 +2314,14 @@ This :class:`bytes` class method returns a bytes object, decoding the given string object. The string must contain two hexadecimal digits per - byte, with ASCII spaces being ignored. + byte, with ASCII whitespace being ignored. >>> bytes.fromhex('2Ef0 F1f2 ') b'.\xf0\xf1\xf2' + .. versionchanged:: 3.7 + :meth:`bytes.fromhex` now skips all ASCII whitespace in the string, not just spaces. + A reverse conversion function exists to transform a bytes object into its hexadecimal representation. @@ -2382,11 +2385,14 @@ This :class:`bytearray` class method returns bytearray object, decoding the given string object. The string must contain two hexadecimal digits - per byte, with ASCII spaces being ignored. + per byte, with ASCII whitespace being ignored. >>> bytearray.fromhex('2Ef0 F1f2 ') bytearray(b'.\xf0\xf1\xf2') + .. versionchanged:: 3.7 + :meth:`bytearray.fromhex` now skips all ASCII whitespace in the string, not just spaces. + A reverse conversion function exists to transform a bytearray object into its hexadecimal representation. diff -r 3b4d00e20694 Doc/whatsnew/3.7.rst --- a/Doc/whatsnew/3.7.rst Mon Dec 19 22:05:46 2016 +0800 +++ b/Doc/whatsnew/3.7.rst Mon Dec 19 09:56:38 2016 -0600 @@ -79,6 +79,8 @@ now have more than 255 parameters. (Contributed by Serhiy Storchaka in :issue:`12844` and :issue:`18896`.) +* :meth:`bytes.fromhex` and :meth:`bytearray.fromhex` now ignore all ASCII + whitespace, not only spaces. (Contributed by Robert Xiao in :issue:`28927`.) New Modules =========== diff -r 3b4d00e20694 Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py Mon Dec 19 22:05:46 2016 +0800 +++ b/Lib/test/test_bytes.py Mon Dec 19 09:56:38 2016 -0600 @@ -293,6 +293,14 @@ b = bytearray([0x1a, 0x2b, 0x30]) self.assertEqual(self.type2test.fromhex('1a2B30'), b) self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b) + + # check that ASCII whitespace is ignored + self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b) + for c in "\x09\x0A\x0B\x0C\x0D\x20": + self.assertEqual(self.type2test.fromhex(c), self.type2test()) + for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028": + self.assertRaises(ValueError, self.type2test.fromhex, c) + self.assertEqual(self.type2test.fromhex('0000'), b'\0\0') self.assertRaises(TypeError, self.type2test.fromhex, b'1B') self.assertRaises(ValueError, self.type2test.fromhex, 'a') diff -r 3b4d00e20694 Objects/bytesobject.c --- a/Objects/bytesobject.c Mon Dec 19 22:05:46 2016 +0800 +++ b/Objects/bytesobject.c Mon Dec 19 09:56:38 2016 -0600 @@ -2378,10 +2378,10 @@ end = str + hexlen; while (str < end) { /* skip over spaces in the input */ - if (*str == ' ') { + if (Py_ISSPACE(*str)) { do { str++; - } while (*str == ' '); + } while (Py_ISSPACE(*str)); if (str >= end) break; }