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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy