gh-80480: Emit DeprecationWarning for array's 'u' type code (#95760)

This commit is contained in:
Hugo van Kemenade 2023-06-11 12:17:35 +03:00 committed by GitHub
parent 3a314f7c3d
commit cc879481e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 48 additions and 10 deletions

View file

@ -57,7 +57,7 @@ Notes:
``Py_UNICODE``. This change doesn't affect its behavior because ``Py_UNICODE``. This change doesn't affect its behavior because
``Py_UNICODE`` is alias of ``wchar_t`` since Python 3.3. ``Py_UNICODE`` is alias of ``wchar_t`` since Python 3.3.
.. deprecated-removed:: 3.3 4.0 .. deprecated-removed:: 3.3 3.16
Please migrate to ``'w'`` typecode. Please migrate to ``'w'`` typecode.

View file

@ -134,6 +134,11 @@ Deprecated
They will be removed in Python 3.15. They will be removed in Python 3.15.
(Contributed by Victor Stinner in :gh:`105096`.) (Contributed by Victor Stinner in :gh:`105096`.)
* :mod:`array`'s ``'u'`` format code, deprecated in docs since Python 3.3,
emits :exc:`DeprecationWarning` since 3.13
and will be removed in Python 3.16.
Use the ``'w'`` format code instead.
(contributed by Hugo van Kemenade in :gh:`80480`)
Removed Removed
======= =======

View file

@ -13,10 +13,13 @@ import pickle
import operator import operator
import struct import struct
import sys import sys
import warnings
import array import array
from array import _array_reconstructor as array_reconstructor from array import _array_reconstructor as array_reconstructor
with warnings.catch_warnings():
warnings.simplefilter('ignore', DeprecationWarning)
sizeof_wchar = array.array('u').itemsize sizeof_wchar = array.array('u').itemsize
@ -93,8 +96,16 @@ UTF16_BE = 19
UTF32_LE = 20 UTF32_LE = 20
UTF32_BE = 21 UTF32_BE = 21
class ArrayReconstructorTest(unittest.TestCase): class ArrayReconstructorTest(unittest.TestCase):
def setUp(self):
warnings.filterwarnings(
"ignore",
message="The 'u' type code is deprecated and "
"will be removed in Python 3.16",
category=DeprecationWarning)
def test_error(self): def test_error(self):
self.assertRaises(TypeError, array_reconstructor, self.assertRaises(TypeError, array_reconstructor,
"", "b", 0, b"") "", "b", 0, b"")
@ -1208,10 +1219,16 @@ class UnicodeTest(StringTest, unittest.TestCase):
self.assertRaises(ValueError, a.tounicode) self.assertRaises(ValueError, a.tounicode)
self.assertRaises(ValueError, str, a) self.assertRaises(ValueError, str, a)
def test_typecode_u_deprecation(self):
with self.assertWarns(DeprecationWarning):
array.array("u")
class UCS4Test(UnicodeTest): class UCS4Test(UnicodeTest):
typecode = 'w' typecode = 'w'
minitemsize = 4 minitemsize = 4
class NumberTest(BaseTest): class NumberTest(BaseTest):
def test_extslice(self): def test_extslice(self):

View file

@ -24,6 +24,7 @@ import warnings
import sys, array, io, os import sys, array, io, os
from decimal import Decimal from decimal import Decimal
from fractions import Fraction from fractions import Fraction
from test.support import warnings_helper
try: try:
from _testbuffer import * from _testbuffer import *
@ -3217,12 +3218,6 @@ class TestBufferProtocol(unittest.TestCase):
nd[0] = (-1, float('nan')) nd[0] = (-1, float('nan'))
self.assertNotEqual(memoryview(nd), nd) self.assertNotEqual(memoryview(nd), nd)
# Depends on issue #15625: the struct module does not understand 'u'.
a = array.array('u', 'xyz')
v = memoryview(a)
self.assertNotEqual(a, v)
self.assertNotEqual(v, a)
# Some ctypes format strings are unknown to the struct module. # Some ctypes format strings are unknown to the struct module.
if ctypes: if ctypes:
# format: "T{>l:x:>l:y:}" # format: "T{>l:x:>l:y:}"
@ -3236,6 +3231,15 @@ class TestBufferProtocol(unittest.TestCase):
self.assertNotEqual(point, a) self.assertNotEqual(point, a)
self.assertRaises(NotImplementedError, a.tolist) self.assertRaises(NotImplementedError, a.tolist)
@warnings_helper.ignore_warnings(category=DeprecationWarning) # gh-80480 array('u')
def test_memoryview_compare_special_cases_deprecated_u_type_code(self):
# Depends on issue #15625: the struct module does not understand 'u'.
a = array.array('u', 'xyz')
v = memoryview(a)
self.assertNotEqual(a, v)
self.assertNotEqual(v, a)
def test_memoryview_compare_ndim_zero(self): def test_memoryview_compare_ndim_zero(self):
nd1 = ndarray(1729, shape=[], format='@L') nd1 = ndarray(1729, shape=[], format='@L')

View file

@ -1,7 +1,7 @@
from test.support import (gc_collect, bigmemtest, _2G, from test.support import (gc_collect, bigmemtest, _2G,
cpython_only, captured_stdout, cpython_only, captured_stdout,
check_disallow_instantiation, is_emscripten, is_wasi, check_disallow_instantiation, is_emscripten, is_wasi,
SHORT_TIMEOUT) warnings_helper, SHORT_TIMEOUT)
import locale import locale
import re import re
import string import string
@ -1522,10 +1522,11 @@ class ReTests(unittest.TestCase):
for x in not_decimal_digits: for x in not_decimal_digits:
self.assertIsNone(re.match(r'^\d$', x)) self.assertIsNone(re.match(r'^\d$', x))
@warnings_helper.ignore_warnings(category=DeprecationWarning) # gh-80480 array('u')
def test_empty_array(self): def test_empty_array(self):
# SF buf 1647541 # SF buf 1647541
import array import array
for typecode in 'bBuhHiIlLfd': for typecode in 'bBhuwHiIlLfd':
a = array.array(typecode) a = array.array(typecode)
self.assertIsNone(re.compile(b"bla").match(a)) self.assertIsNone(re.compile(b"bla").match(a))
self.assertEqual(re.compile(b"").match(a).groups(), ()) self.assertEqual(re.compile(b"").match(a).groups(), ())

View file

@ -0,0 +1,2 @@
Emit :exc:`DeprecationWarning` for :mod:`array`'s ``'u'`` type code,
deprecated in docs since Python 3.3.

View file

@ -2679,6 +2679,15 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL; return NULL;
} }
if (c == 'u') {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"The 'u' type code is deprecated and "
"will be removed in Python 3.16",
1)) {
return NULL;
}
}
bool is_unicode = c == 'u' || c == 'w'; bool is_unicode = c == 'u' || c == 'w';
if (initial && !is_unicode) { if (initial && !is_unicode) {