https://github.com/python/cpython/commit/d2abd5733b2dc478abb848230d7e8374e74a6927
commit: d2abd5733b2dc478abb848230d7e8374e74a6927
branch: main
author: Hugo van Kemenade <[email protected]>
committer: hugovk <[email protected]>
date: 2025-12-18T14:22:23Z
summary:
gh-76007: Deprecate `VERSION` in `xml.etree.ElementTree` & `version` in
`xml.sax.expatreader` & `xml.sax.handler` (#142898)
files:
A Misc/NEWS.d/next/Library/2025-12-16-14-21-20.gh-issue-76007.O4AmYl.rst
M Doc/deprecations/pending-removal-in-3.20.rst
M Doc/whatsnew/3.15.rst
M Lib/test/test_sax.py
M Lib/test/test_xml_etree.py
M Lib/xml/etree/ElementTree.py
M Lib/xml/sax/expatreader.py
M Lib/xml/sax/handler.py
diff --git a/Doc/deprecations/pending-removal-in-3.20.rst
b/Doc/deprecations/pending-removal-in-3.20.rst
index 185f20fbc6d125..4e4b2e1d5f8fff 100644
--- a/Doc/deprecations/pending-removal-in-3.20.rst
+++ b/Doc/deprecations/pending-removal-in-3.20.rst
@@ -1,9 +1,9 @@
Pending removal in Python 3.20
------------------------------
-* The ``__version__`` attribute has been deprecated in these standard library
- modules and will be removed in Python 3.20.
- Use :py:data:`sys.version_info` instead.
+* The ``__version__``, ``version`` and ``VERSION`` attributes have been
+ deprecated in these standard library modules and will be removed in
+ Python 3.20. Use :py:data:`sys.version_info` instead.
- :mod:`argparse`
- :mod:`csv`
@@ -24,6 +24,9 @@ Pending removal in Python 3.20
- :mod:`tkinter.font`
- :mod:`tkinter.ttk`
- :mod:`wsgiref.simple_server`
+ - :mod:`xml.etree.ElementTree`
+ - :mod:`!xml.sax.expatreader`
+ - :mod:`xml.sax.handler`
- :mod:`zlib`
(Contributed by Hugo van Kemenade and Stan Ulbrych in :gh:`76007`.)
diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst
index 7e032fe5df2fdf..753b1990eb3308 100644
--- a/Doc/whatsnew/3.15.rst
+++ b/Doc/whatsnew/3.15.rst
@@ -1104,9 +1104,9 @@ New deprecations
* ``__version__``
- * The ``__version__`` attribute has been deprecated in these standard library
- modules and will be removed in Python 3.20.
- Use :py:data:`sys.version_info` instead.
+ * The ``__version__``, ``version`` and ``VERSION`` attributes have been
+ deprecated in these standard library modules and will be removed in
+ Python 3.20. Use :py:data:`sys.version_info` instead.
- :mod:`argparse`
- :mod:`csv`
@@ -1127,6 +1127,9 @@ New deprecations
- :mod:`tkinter.font`
- :mod:`tkinter.ttk`
- :mod:`wsgiref.simple_server`
+ - :mod:`xml.etree.ElementTree`
+ - :mod:`!xml.sax.expatreader`
+ - :mod:`xml.sax.handler`
- :mod:`zlib`
(Contributed by Hugo van Kemenade and Stan Ulbrych in :gh:`76007`.)
diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py
index 5c10bcedc69bc6..29babd7bf6996a 100644
--- a/Lib/test/test_sax.py
+++ b/Lib/test/test_sax.py
@@ -1573,5 +1573,17 @@ def test_all(self):
check__all__(self, sax, extra=extra)
+class TestModule(unittest.TestCase):
+ def test_deprecated__version__and__date__(self):
+ for module in (sax.expatreader, sax.handler):
+ with self.subTest(module=module):
+ with self.assertWarnsRegex(
+ DeprecationWarning,
+ "'version' is deprecated and slated for removal in Python
3.20",
+ ) as cm:
+ getattr(module, "version")
+ self.assertEqual(cm.filename, __file__)
+
+
if __name__ == "__main__":
unittest.main()
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index 87811199706a1f..0178ed02b35be1 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -4705,6 +4705,19 @@ def get_option(config, option_name, default=None):
# --------------------------------------------------------------------
+
+class TestModule(unittest.TestCase):
+ def test_deprecated_version(self):
+ with self.assertWarnsRegex(
+ DeprecationWarning,
+ "'VERSION' is deprecated and slated for removal in Python 3.20",
+ ) as cm:
+ getattr(ET, "VERSION")
+ self.assertEqual(cm.filename, __file__)
+
+
+# --------------------------------------------------------------------
+
def setUpModule(module=None):
# When invoked without a module, runs the Python ET tests by loading pyET.
# Otherwise, uses the given module as the ET.
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
index d8c0b1b621684b..92f902b9a8b875 100644
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -83,15 +83,12 @@
"SubElement",
"tostring", "tostringlist",
"TreeBuilder",
- "VERSION",
"XML", "XMLID",
"XMLParser", "XMLPullParser",
"register_namespace",
"canonicalize", "C14NWriterTarget",
]
-VERSION = "1.3.0"
-
import sys
import re
import warnings
@@ -2104,3 +2101,14 @@ def _escape_attrib_c14n(text):
pass
else:
_set_factories(Comment, ProcessingInstruction)
+
+
+# --------------------------------------------------------------------
+
+def __getattr__(name):
+ if name == "VERSION":
+ from warnings import _deprecated
+
+ _deprecated("VERSION", remove=(3, 20))
+ return "1.3.0" # Do not change
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py
index ba3c1e98517429..37b1add2848487 100644
--- a/Lib/xml/sax/expatreader.py
+++ b/Lib/xml/sax/expatreader.py
@@ -3,8 +3,6 @@
pyexpat.__version__ == '2.22'.
"""
-version = "0.20"
-
from xml.sax._exceptions import *
from xml.sax.handler import feature_validation, feature_namespaces
from xml.sax.handler import feature_namespace_prefixes
@@ -446,6 +444,16 @@ def create_parser(*args, **kwargs):
# ---
+def __getattr__(name):
+ if name == "version":
+ from warnings import _deprecated
+
+ _deprecated("version", remove=(3, 20))
+ return "0.20" # Do not change
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
+
+# ---
+
if __name__ == "__main__":
import xml.sax.saxutils
p = create_parser()
diff --git a/Lib/xml/sax/handler.py b/Lib/xml/sax/handler.py
index 3183c3fe96d74f..9c2e3af838a40f 100644
--- a/Lib/xml/sax/handler.py
+++ b/Lib/xml/sax/handler.py
@@ -9,8 +9,6 @@
$Id$
"""
-version = '2.0beta'
-
#============================================================================
#
# HANDLER INTERFACES
@@ -385,3 +383,12 @@ def startCDATA(self):
def endCDATA(self):
"""Reports the end of a CDATA marked section."""
+
+
+def __getattr__(name):
+ if name == "version":
+ from warnings import _deprecated
+
+ _deprecated("version", remove=(3, 20))
+ return "2.0beta" # Do not change
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
diff --git
a/Misc/NEWS.d/next/Library/2025-12-16-14-21-20.gh-issue-76007.O4AmYl.rst
b/Misc/NEWS.d/next/Library/2025-12-16-14-21-20.gh-issue-76007.O4AmYl.rst
new file mode 100644
index 00000000000000..cfda7327e8fee8
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-12-16-14-21-20.gh-issue-76007.O4AmYl.rst
@@ -0,0 +1,3 @@
+Deprecate ``VERSION`` from :mod:`xml.etree.ElementTree` and ``version`` from
+:mod:`!xml.sax.expatreader` and :mod:`xml.sax.handler`. Patch by Hugo van
+Kemenade.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]