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-43723: deprecate camelCase aliases from threading #25174

Merged
merged 7 commits into from
Apr 12, 2021
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
19 changes: 17 additions & 2 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
The ``camelCase`` names used for some
methods and functions in this module in the Python 2.x series are still
supported by this module.
supported by this module for compatibility with Python 2.5 and lower.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer to say "deprecated" somewhere, rather than "still supported".

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworded



.. 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`.

.. deprecated:: 3.10
The function `activeCount` is an alias for this function.
vstinner marked this conversation as resolved.
Show resolved Hide resolved

.. function:: current_thread()

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

.. deprecated:: 3.10
The function `currentThread` is an alias for this function.
JelleZijlstra marked this conversation as resolved.
Show resolved Hide resolved


.. function:: excepthook(args, /)

Expand Down Expand Up @@ -384,6 +389,8 @@ since it is impossible to detect the termination of alien threads.
Old getter/setter API for :attr:`~Thread.name`; use it directly as a
property instead.
JelleZijlstra marked this conversation as resolved.
Show resolved Hide resolved

.. deprecated:: 3.10

.. attribute:: ident

The 'thread identifier' of this thread or ``None`` if the thread has not
Expand Down Expand Up @@ -436,6 +443,8 @@ since it is impossible to detect the termination of alien threads.
Old getter/setter API for :attr:`~Thread.daemon`; use it directly as a
property instead.
JelleZijlstra marked this conversation as resolved.
Show resolved Hide resolved

.. deprecated:: 3.10


.. _lock-objects:

Expand Down Expand Up @@ -771,6 +780,9 @@ 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.

.. deprecated:: 3.10
The method `notifyAll` is an alias for this method.
JelleZijlstra marked this conversation as resolved.
Show resolved Hide resolved


.. _semaphore-objects:

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

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

.. deprecated:: 3.10
The method `isSet` is an alias for this method.
JelleZijlstra marked this conversation as resolved.
Show resolved Hide resolved

.. method:: set()

Set the internal flag to true. All threads waiting for it to become true
Expand Down
11 changes: 11 additions & 0 deletions Doc/whatsnew/3.10.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1070,6 +1070,17 @@ 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`.)
JelleZijlstra marked this conversation as resolved.
Show resolved Hide resolved


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
10 changes: 10 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,10 @@
The following `threading` methods are now deprecated and should be replaced:
`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`.
Patch by Jelle Zijlstra.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The following `threading` methods are now deprecated and should be replaced:
`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`.
Patch by Jelle Zijlstra.
The following `threading` methods are now deprecated and should be replaced:
* `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`.
Patch by Jelle Zijlstra.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had to do it a little differently to get the markup working and work around python/core-workflow#394.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had to do it a little differently to get the markup working and work around python/core-workflow#394.

If you put each item on a long line, you should not be affected by https://github.com/python/core-workflow/issues/394 no?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

blurb reflows the lines to make them fit into 76 characters, so I have to make each line fit into 76 characters to avoid the bug.