8000 bpo-36346: Emit DeprecationWarning for PyArg_Parse() with 'u' or 'Z'.… · python/cpython@91a639a · GitHub
[go: up one dir, main page]

Skip to content

Commit 91a639a

Browse files
authored
bpo-36346: Emit DeprecationWarning for PyArg_Parse() with 'u' or 'Z'. (GH-20927)
Emit DeprecationWarning when PyArg_Parse*() is called with 'u', 'Z' format. See PEP 623.
1 parent 5a4aa4c commit 91a639a

File tree

4 files changed

+69
-27
lines changed

4 files changed

+69
-27
lines changed

Lib/test/test_getargs2.py

Lines changed: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import sys
55
from test import support
66
from test.support import import_helper
7+
from test.support import warnings_helper
78
# Skip this test if the _testcapi module isn't available.
89
_testcapi = import_helper.import_module('_testcapi')
910
from _testcapi import getargs_keywords, getargs_keyword_only
@@ -979,42 +980,66 @@ def test_et_hash(self):
979980
@support.requires_legacy_unicode_capi
980981
def test_u(self):
981982
from _testcapi import getargs_u
982-
self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
983-
self.assertRaises(ValueError, getargs_u, 'nul:\0')
984-
self.assertRaises(TypeError, getargs_u, b'bytes')
985-
self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
986-
self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
987-
self.assertRaises(TypeError, getargs_u, None)
983+
with self.assertWarns(DeprecationWarning):
984+
self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
985+
with self.assertWarns(DeprecationWarning):
986+
self.assertRaises(ValueError, getargs_u, 'nul:\0')
987+
with self.assertWarns(DeprecationWarning):
988+
self.assertRaises(TypeError, getargs_u, b'bytes')
989+
with self.assertWarns(DeprecationWarning):
990+
self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
991+
with self.assertWarns(DeprecationWarning):
992+
self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
993+
with self.assertWarns(DeprecationWarning):
994+
self.assertRaises(TypeError, getargs_u, None)
988995

989996
@support.requires_legacy_unicode_capi
990997
def test_u_hash(self):
991998
from _testcapi import getargs_u_hash
992-
self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
993-
self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
994-
self.assertRaises(TypeError, getargs_u_hash, b'bytes')
995-
self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
996-
self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
997-
self.assertRaises(TypeError, getargs_u_hash, None)
999+
with self.assertWarns(DeprecationWarning):
1000+
self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
1001+
with self.assertWarns(DeprecationWarning):
1002+
self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
1003+
with self.assertWarns(DeprecationWarning):
1004+
self.assertRaises(TypeError, getargs_u_hash, b'bytes')
1005+
with self.assertWarns(DeprecationWarning):
1006+
self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
1007+
with self.assertWarns(DeprecationWarning):
1008+
self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
1009+
with self.assertWarns(DeprecationWarning):
1010+
self.assertRaises(TypeError, getargs_u_hash, None)
9981011

9991012
@support.requires_legacy_unicode_capi
10001013
def test_Z(self):
10011014
from _testcapi import getargs_Z
1002-
self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
1003-
self.assertRaises(ValueError, getargs_Z, 'nul:\0')
1004-
self.assertRaises(TypeError, getargs_Z, b'bytes')
1005-
self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
1006-
self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
1007-
self.assertIsNone(getargs_Z(None))
1015+
with self.assertWarns(DeprecationWarning):
1016+
self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
1017+
with self.assertWarns(DeprecationWarning):
1018+
self.assertRaises(ValueError, getargs_Z, 'nul:\0')
1019+
with self.assertWarns(DeprecationWarning):
1020+
self.assertRaises(TypeError, getargs_Z, b'bytes')
1021+
with self.assertWarns(DeprecationWarning):
1022+
self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
1023+
with self.assertWarns(DeprecationWarning):
1024+
self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
1025+
with self.assertWarns(DeprecationWarning):
1026+
self.assertIsNone(getargs_Z(None))
10081027

10091028
@support.requires_legacy_unicode_capi
10101029
def test_Z_hash(self):
10111030
from _testcapi import getargs_Z_hash
1012-
self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
1013-
self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
1014-
self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
1015-
self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
1016-
self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
1017-
self.assertIsNone(getargs_Z_hash(None))
1031+
with self.assertWarns(DeprecationWarning):
1032+
self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
1033+
with self.assertWarns(DeprecationWarning):
1034+
self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
1035+
with self.assertWarns(DeprecationWarning):
1036+
self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
1037+
with self.assertWarns(DeprecationWarning):
1038+
self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
1039+
with self.assertWarns(DeprecationWarning):
1040+
self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
1041+
with self.assertWarns(DeprecationWarning):
1042+
self.assertIsNone(getargs_Z_hash(None))
10181043

10191044

10201045
class Object_TestCase(unittest.TestCase):
@@ -1053,6 +1078,8 @@ def test(self):
10531078

10541079
class SkipitemTest(unittest.TestCase):
10551080

1081+
# u, and Z raises DeprecationWarning
1082+
@warnings_helper.ignore_warnings(category=DeprecationWarning)
10561083
def test_skipitem(self):
10571084
"""
10581085 If this test failed, you probably added a new "format unit"
@@ -1221,6 +1248,14 @@ class Test_testcapi(unittest.TestCase):
12211248
for name in dir(_testcapi)
12221249
if name.startswith('test_') and name.endswith('_code'))
12231250

1251+
@warnings_helper.ignore_warnings(category=DeprecationWarning)
1252+
def test_u_code(self):
1253+
_testcapi.test_u_code()
1254+
1255+
@warnings_helper.ignore_warnings(category=DeprecationWarning)
1256+
def test_Z_code(self):
1257+
_testcapi.test_Z_code()
1258+
12241259

12251260
if __name__ == "__main__":
12261261
unittest.main()

Lib/test/test_unicode.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2368,12 +2368,14 @@ def test_resize(self):
23682368
text = 'a' * length + 'b'
23692369

23702370
# fill wstr internal field
2371-
abc = getargs_u(text)
2371+
with self.assertWarns(DeprecationWarning):
2372+
abc = getargs_u(text)
23722373
self.assertEqual(abc, text)
23732374

23742375
# resize text: wstr field must be cleared and then recomputed
23752376
text += 'c'
2376-
abcdef = getargs_u(text)
2377+
with self.assertWarns(DeprecationWarning):
2378+
abcdef = getargs_u(text)
23772379
self.assertNotEqual(abc, abcdef)
23782380
self.assertEqual(abcdef, text)
23792381

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
``PyArg_Parse*()`` functions now emits ``DeprecationWarning`` when ``u`` or
2+
``Z`` format is used. See :pep:`623` for detail.

Python/getargs.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
10141014
case 'u': /* raw unicode buffer (Py_UNICODE *) */
10151015
case 'Z': /* raw unicode buffer or None */
10161016
{
1017-
// TODO: Raise DeprecationWarning
1017+
if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1018+
"getargs: The '%c' format is deprecated. Use 'U' instead.", c)) {
1019+
return NULL;
1020+
}
10181021
_Py_COMP_DIAG_PUSH
10191022
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
10201023
Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);

0 commit comments

Comments
 (0)
0