Skip to content

Commit

Permalink
bpo-43723: Deprecate camelCase aliases from threading (GH-25174)
Browse files Browse the repository at this point in the history
The snake_case names have existed since Python 2.6, so there is
no reason to keep the old camelCase names around. One similar
method, threading.Thread.isAlive, was already removed in
Python 3.9 (bpo-37804).
  • Loading branch information
JelleZijlstra authored Apr 12, 2021
1 parent cc2ffcd commit 9825bdf
Show file tree
Hide file tree
Showing 7 changed files with 159 additions and 20 deletions.
4 changes: 2 additions & 2 deletions Doc/faq/library.rst
Original file line number Diff line number Diff line change
Expand Up @@ -319,11 +319,11 @@ Here's a trivial example::
try:
arg = q.get(block=False)
except queue.Empty:
print('Worker', threading.currentThread(), end=' ')
print('Worker', threading.current_thread(), end=' ')
print('queue empty')
break
else:
print('Worker', threading.currentThread(), end=' ')
print('Worker', threading.current_thread(), end=' ')
print('running with argument', arg)
time.sleep(0.5)
Expand Down
2 changes: 1 addition & 1 deletion Doc/library/idle.rst
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,7 @@ intended to be the same as executing the same code by the default method,
directly with Python in a text-mode system console or terminal window.
However, the different interface and operation occasionally affect
visible results. For instance, ``sys.modules`` starts with more entries,
and ``threading.activeCount()`` returns 2 instead of 1.
and ``threading.active_count()`` returns 2 instead of 1.

By default, IDLE runs user code in a separate OS process rather than in
the user interface process that runs the shell and editor. In the execution
Expand Down
22 changes: 17 additions & 5 deletions Doc/library/threading.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ level :mod:`_thread` module. See also the :mod:`queue` module.

.. note::

While they are not listed below, the ``camelCase`` names used for some
methods and functions in this module in the Python 2.x series are still
supported by this module.
In the Python 2.x series, this module contained ``camelCase`` names
for some methods and functions. These are deprecated as of Python 3.10,
but they are still supported for compatibility with Python 2.5 and lower.


.. impl-detail::
Expand All @@ -42,6 +42,8 @@ This module defines the following functions:
Return the number of :class:`Thread` objects currently alive. The returned
count is equal to the length of the list returned by :func:`.enumerate`.

The function ``activeCount`` is a deprecated alias for this function.


.. function:: current_thread()

Expand All @@ -50,6 +52,8 @@ This module defines the following functions:
:mod:`threading` module, a dummy thread object with limited functionality is
returned.

The function ``currentThread`` is a deprecated alias for this function.


.. function:: excepthook(args, /)

Expand Down Expand Up @@ -381,9 +385,11 @@ since it is impossible to detect the termination of alien threads.
.. method:: getName()
setName()

Old getter/setter API for :attr:`~Thread.name`; use it directly as a
Deprecated getter/setter API for :attr:`~Thread.name`; use it directly as a
property instead.

.. deprecated:: 3.10

.. attribute:: ident

The 'thread identifier' of this thread or ``None`` if the thread has not
Expand Down Expand Up @@ -433,9 +439,11 @@ since it is impossible to detect the termination of alien threads.
.. method:: isDaemon()
setDaemon()

Old getter/setter API for :attr:`~Thread.daemon`; use it directly as a
Deprecated getter/setter API for :attr:`~Thread.daemon`; use it directly as a
property instead.

.. deprecated:: 3.10


.. _lock-objects:

Expand Down Expand Up @@ -771,6 +779,8 @@ item to the buffer only needs to wake up one consumer thread.
calling thread has not acquired the lock when this method is called, a
:exc:`RuntimeError` is raised.

The method ``notifyAll`` is a deprecated alias for this method.


.. _semaphore-objects:

Expand Down Expand Up @@ -908,6 +918,8 @@ method. The :meth:`~Event.wait` method blocks until the flag is true.

Return ``True`` if and only if the internal flag is true.

The method ``isSet`` is a deprecated alias for this method.

.. method:: set()

Set the internal flag to true. All threads waiting for it to become true
Expand Down
21 changes: 21 additions & 0 deletions Doc/whatsnew/3.10.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1129,6 +1129,27 @@ Deprecated
``cache=shared`` query parameter.
(Contributed by Erlend E. Aasland in :issue:`24464`.)
* The following ``threading`` methods are now deprecated:
* ``threading.currentThread`` => :func:`threading.current_thread`
* ``threading.activeCount`` => :func:`threading.active_count`
* ``threading.Condition.notifyAll`` =>
:meth:`threading.Condition.notify_all`
* ``threading.Event.isSet`` => :meth:`threading.Event.is_set`
* ``threading.Thread.setName`` => :attr:`threading.Thread.name`
* ``threading.thread.getName`` => :attr:`threading.Thread.name`
* ``threading.Thread.isDaemon`` => :attr:`threading.Thread.daemon`
* ``threading.Thread.setDaemon`` => :attr:`threading.Thread.daemon`
(Contributed by Jelle Zijlstra in :issue:`21574`.)

This comment has been minimized.

Copy link
@odony

odony Apr 15, 2022

@JelleZijlstra the bpo number seems to be a typo, that's supposed to be bpo 43723, right? I got confused for a bit reading bpo-21574 looking for threading stuff ;-)

This comment has been minimized.

Copy link
@JelleZijlstra

JelleZijlstra Apr 15, 2022

Author Member

Oops, good catch!

Removed
=======
Expand Down
35 changes: 27 additions & 8 deletions Lib/test/test_threading.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,9 @@ def test_various_ops(self):

def test_ident_of_no_threading_threads(self):
# The ident still must work for the main thread and dummy threads.
self.assertIsNotNone(threading.currentThread().ident)
self.assertIsNotNone(threading.current_thread().ident)
def f():
ident.append(threading.currentThread().ident)
ident.append(threading.current_thread().ident)
done.set()
done = threading.Event()
ident = []
Expand Down Expand Up @@ -447,13 +447,32 @@ def test_old_threading_api(self):
# Just a quick sanity check to make sure the old method names are
# still present
t = threading.Thread()
t.isDaemon()
t.setDaemon(True)
t.getName()
t.setName("name")
with self.assertWarnsRegex(DeprecationWarning,
r'get the daemon attribute'):
t.isDaemon()
with self.assertWarnsRegex(DeprecationWarning,
r'set the daemon attribute'):
t.setDaemon(True)
with self.assertWarnsRegex(DeprecationWarning,
r'get the name attribute'):
t.getName()
with self.assertWarnsRegex(DeprecationWarning,
r'set the name attribute'):
t.setName("name")

e = threading.Event()
e.isSet()
threading.activeCount()
with self.assertWarnsRegex(DeprecationWarning, 'use is_set()'):
e.isSet()

cond = threading.Condition()
cond.acquire()
with self.assertWarnsRegex(DeprecationWarning, 'use notify_all()'):
cond.notifyAll()

with self.assertWarnsRegex(DeprecationWarning, 'use active_count()'):
threading.activeCount()
with self.assertWarnsRegex(DeprecationWarning, 'use current_thread()'):
threading.currentThread()

def test_repr_daemon(self):
t = threading.Thread()
Expand Down
76 changes: 72 additions & 4 deletions Lib/threading.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,16 @@ def notify_all(self):
"""
self.notify(len(self._waiters))

notifyAll = notify_all
def notifyAll(self):
"""Wake up all threads waiting on this condition.
This method is deprecated, use notify_all() instead.
"""
import warnings
warnings.warn('notifyAll() is deprecated, use notify_all() instead',
DeprecationWarning, stacklevel=2)
self.notify_all()


class Semaphore:
Expand Down Expand Up @@ -538,7 +547,16 @@ def is_set(self):
"""Return true if and only if the internal flag is true."""
return self._flag

isSet = is_set
def isSet(self):
"""Return true if and only if the internal flag is true.
This method is deprecated, use notify_all() instead.
"""
import warnings
warnings.warn('isSet() is deprecated, use is_set() instead',
DeprecationWarning, stacklevel=2)
return self.is_set()

def set(self):
"""Set the internal flag to true.
Expand Down Expand Up @@ -1146,15 +1164,47 @@ def daemon(self, daemonic):
self._daemonic = daemonic

def isDaemon(self):
"""Return whether this thread is a daemon.
This method is deprecated, use the daemon attribute instead.
"""
import warnings
warnings.warn('isDaemon() is deprecated, get the daemon attribute instead',
DeprecationWarning, stacklevel=2)
return self.daemon

def setDaemon(self, daemonic):
"""Set whether this thread is a daemon.
This method is deprecated, use the .daemon property instead.
"""
import warnings
warnings.warn('setDaemon() is deprecated, set the daemon attribute instead',
DeprecationWarning, stacklevel=2)
self.daemon = daemonic

def getName(self):
"""Return a string used for identification purposes only.
This method is deprecated, use the name attribute instead.
"""
import warnings
warnings.warn('getName() is deprecated, get the name attribute instead',
DeprecationWarning, stacklevel=2)
return self.name

def setName(self, name):
"""Set the name string for this thread.
This method is deprecated, use the name attribute instead.
"""
import warnings
warnings.warn('setName() is deprecated, set the name attribute instead',
DeprecationWarning, stacklevel=2)
self.name = name


Expand Down Expand Up @@ -1349,7 +1399,16 @@ def current_thread():
except KeyError:
return _DummyThread()

currentThread = current_thread
def currentThread():
"""Return the current Thread object, corresponding to the caller's thread of control.
This function is deprecated, use current_thread() instead.
"""
import warnings
warnings.warn('currentThread() is deprecated, use current_thread() instead',
DeprecationWarning, stacklevel=2)
return current_thread()

def active_count():
"""Return the number of Thread objects currently alive.
Expand All @@ -1361,7 +1420,16 @@ def active_count():
with _active_limbo_lock:
return len(_active) + len(_limbo)

activeCount = active_count
def activeCount():
"""Return the number of Thread objects currently alive.
This function is deprecated, use active_count() instead.
"""
import warnings
warnings.warn('activeCount() is deprecated, use active_count() instead',
DeprecationWarning, stacklevel=2)
return active_count()

def _enumerate():
# Same as enumerate(), but without the lock. Internal use only.
Expand Down
19 changes: 19 additions & 0 deletions Misc/NEWS.d/next/Library/2021-04-03-18-03-44.bpo-43723.uBhBZS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
The following ``threading`` methods are now deprecated and should be replaced:

- ``currentThread`` => :func:`threading.current_thread`

- ``activeCount`` => :func:`threading.active_count`

- ``Condition.notifyAll`` => :meth:`threading.Condition.notify_all`

- ``Event.isSet`` => :meth:`threading.Event.is_set`

- ``Thread.setName`` => :attr:`threading.Thread.name`

- ``thread.getName`` => :attr:`threading.Thread.name`

- ``Thread.isDaemon`` => :attr:`threading.Thread.daemon`

- ``Thread.setDaemon`` => :attr:`threading.Thread.daemon`

Patch by Jelle Zijlstra.

0 comments on commit 9825bdf

Please sign in to comment.