From d05b000c6bcd39dba4f4b2656e45954802649562 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 8 Oct 2019 14:31:35 +0300 Subject: [PATCH] bpo-38371: Tkinter: deprecate the split() method. (GH-16584) --- Doc/whatsnew/3.9.rst | 5 +++++ Lib/test/test_tcl.py | 13 +++++++++---- .../2019-10-04-18-39-59.bpo-38371.S6Klvm.rst | 3 +++ Modules/_tkinter.c | 6 ++++++ 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-10-04-18-39-59.bpo-38371.S6Klvm.rst diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 9f2a659a9dc..6b4abc0567c 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -191,6 +191,11 @@ Deprecated the module will restrict its seeds to :const:`None`, :class:`int`, :class:`float`, :class:`str`, :class:`bytes`, and :class:`bytearray`. +* Deprecated the ``split()`` method of :class:`_tkinter.TkappType` in + favour of the ``splitlist()`` method which has more consistent and + predicable behavior. + (Contributed by Serhiy Storchaka in :issue:`38371`.) + Removed ======= diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index 3183ea850f7..1c5b9cf2bd2 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -3,6 +3,7 @@ import re import subprocess import sys import os +import warnings from test import support # Skip this test if the _tkinter module wasn't built. @@ -573,9 +574,12 @@ class TclTest(unittest.TestCase): def test_split(self): split = self.interp.tk.split call = self.interp.tk.call - self.assertRaises(TypeError, split) - self.assertRaises(TypeError, split, 'a', 'b') - self.assertRaises(TypeError, split, 2) + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', r'\bsplit\b.*\bsplitlist\b', + DeprecationWarning) + self.assertRaises(TypeError, split) + self.assertRaises(TypeError, split, 'a', 'b') + self.assertRaises(TypeError, split, 2) testcases = [ ('2', '2'), ('', ''), @@ -617,7 +621,8 @@ class TclTest(unittest.TestCase): expected), ] for arg, res in testcases: - self.assertEqual(split(arg), res, msg=arg) + with self.assertWarns(DeprecationWarning): + self.assertEqual(split(arg), res, msg=arg) def test_splitdict(self): splitdict = tkinter._splitdict diff --git a/Misc/NEWS.d/next/Library/2019-10-04-18-39-59.bpo-38371.S6Klvm.rst b/Misc/NEWS.d/next/Library/2019-10-04-18-39-59.bpo-38371.S6Klvm.rst new file mode 100644 index 00000000000..583399531ac --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-04-18-39-59.bpo-38371.S6Klvm.rst @@ -0,0 +1,3 @@ +Deprecated the ``split()`` method in :class:`_tkinter.TkappType` in favour +of the ``splitlist()`` method which has more consistent and predicable +behavior. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index c431d611d4d..235cb6bc28d 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -2304,6 +2304,12 @@ _tkinter_tkapp_split(TkappObject *self, PyObject *arg) PyObject *v; char *list; + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "split() is deprecated; consider using splitlist() instead", 1)) + { + return NULL; + } + if (PyTclObject_Check(arg)) { Tcl_Obj *value = ((PyTclObject*)arg)->value; int objc;