mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
gh-80480: Emit DeprecationWarning for array's 'u' type code (#95760)
This commit is contained in:
parent
3a314f7c3d
commit
cc879481e2
7 changed files with 48 additions and 10 deletions
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
=======
|
=======
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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(), ())
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Emit :exc:`DeprecationWarning` for :mod:`array`'s ``'u'`` type code,
|
||||||
|
deprecated in docs since Python 3.3.
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue