Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-42264: Deprecate sqlite3.OptimizedUnicode #23163

Merged
merged 11 commits into from
Nov 17, 2020
5 changes: 5 additions & 0 deletions Doc/whatsnew/3.10.rst
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,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
=======
Expand Down
14 changes: 14 additions & 0 deletions Lib/sqlite3/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,17 @@
# 3. This notice may not be removed or altered from any source distribution.

from sqlite3.dbapi2 import *


# OptimizedUnicode was deprecated in Python 3.10. It's scheduled for removal
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved
# in Python 3.12.
def __getattr__(name):
if name == "OptimizedUnicode":
import warnings
msg = ("""
OptimizedUnicode is obsolete. You can safely remove it from your
code, as it defaults to 'str' anyway.
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved
""")
warnings.warn(msg, DeprecationWarning, stacklevel=2)
return str
raise AttributeError(f"module 'sqlite3' has no attribute '{name}'")
7 changes: 4 additions & 3 deletions Lib/sqlite3/test/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,10 @@ def CheckCustom(self):
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()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
``sqlite3.OptimizedUnicode`` has been deprecated. It has been undocumented
and obsolete since Python 3.3.
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved
9 changes: 0 additions & 9 deletions Modules/_sqlite/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down