From a1f401a58b213e400fbd8f0fa8dc5260a2389dab Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Tue, 17 Nov 2020 16:55:12 +0100 Subject: [PATCH] bpo-42264: Deprecate sqlite3.OptimizedUnicode (GH-23163) --- Doc/whatsnew/3.10.rst | 5 +++++ Lib/sqlite3/__init__.py | 14 ++++++++++++++ Lib/sqlite3/test/factory.py | 7 ++++--- .../2020-11-05-13-32-41.bpo-42264.r4KYUU.rst | 3 +++ Modules/_sqlite/module.c | 9 --------- 5 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index ffc34d77357..786cc61003a 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -360,6 +360,11 @@ Deprecated as appropriate to help identify code which needs updating during this transition. +* ``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python + 3.3, when it was made an alias to :class:`str`. It is now deprecated, + scheduled for removal in Python 3.12. + (Contributed by Erlend E. Aasland in :issue:`42264`.) + Removed ======= diff --git a/Lib/sqlite3/__init__.py b/Lib/sqlite3/__init__.py index 6c91df27cca..f001c0678e1 100644 --- a/Lib/sqlite3/__init__.py +++ b/Lib/sqlite3/__init__.py @@ -21,3 +21,17 @@ # 3. This notice may not be removed or altered from any source distribution. from sqlite3.dbapi2 import * + + +# bpo-42264: OptimizedUnicode was deprecated in Python 3.10. It's scheduled +# for removal in Python 3.12. +def __getattr__(name): + if name == "OptimizedUnicode": + import warnings + msg = (""" + OptimizedUnicode is deprecated and will be removed in Python 3.12. + Since Python 3.3 it has simply been an alias for 'str'. + """) + warnings.warn(msg, DeprecationWarning, stacklevel=2) + return str + raise AttributeError(f"module 'sqlite3' has no attribute '{name}'") diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py index 95dd24bdfad..d91997333b1 100644 --- a/Lib/sqlite3/test/factory.py +++ b/Lib/sqlite3/test/factory.py @@ -254,9 +254,10 @@ class TextFactoryTests(unittest.TestCase): self.assertTrue(row[0].endswith("reich"), "column must contain original data") def CheckOptimizedUnicode(self): - # In py3k, str objects are always returned when text_factory - # is OptimizedUnicode - self.con.text_factory = sqlite.OptimizedUnicode + # OptimizedUnicode is deprecated as of Python 3.10 + with self.assertWarns(DeprecationWarning) as cm: + self.con.text_factory = sqlite.OptimizedUnicode + self.assertIn("factory.py", cm.filename) austria = "Österreich" germany = "Deutchland" a_row = self.con.execute("select ?", (austria,)).fetchone() diff --git a/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst b/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst new file mode 100644 index 00000000000..dd8e6871eb8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst @@ -0,0 +1,3 @@ +``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python +3.3, when it was made an alias to :class:`str`. It is now deprecated, +scheduled for removal in Python 3.12. diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 9fdf51417ed..372f3dda4cb 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -412,15 +412,6 @@ PyMODINIT_FUNC PyInit__sqlite3(void) ADD_EXCEPTION(module, "DataError", pysqlite_DataError, pysqlite_DatabaseError); ADD_EXCEPTION(module, "NotSupportedError", pysqlite_NotSupportedError, pysqlite_DatabaseError); - /* In Python 2.x, setting Connection.text_factory to - OptimizedUnicode caused Unicode objects to be returned for - non-ASCII data and bytestrings to be returned for ASCII data. - Now OptimizedUnicode is an alias for str, so it has no - effect. */ - if (PyModule_AddObjectRef(module, "OptimizedUnicode", (PyObject*)&PyUnicode_Type) < 0) { - goto error; - } - /* Set integer constants */ if (add_integer_constants(module) < 0) { goto error;