bpo-41149: Fix a bug in threading that causes fals-y threads callables to fail to start. (GH-21201)

This commit is contained in:
BarneyStratford 2021-02-02 20:24:24 +00:00 committed by GitHub
parent 58fb156edd
commit 01c4fddc4b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 1 deletions

View file

@ -855,6 +855,26 @@ def __del__(self):
""")
self.assertEqual(out.rstrip(), b"thread_dict.atexit = 'value'")
def test_boolean_target(self):
# bpo-41149: A thread that had a boolean value of False would not
# run, regardless of whether it was callable. The correct behaviour
# is for a thread to do nothing if its target is None, and to call
# the target otherwise.
class BooleanTarget(object):
def __init__(self):
self.ran = False
def __bool__(self):
return False
def __call__(self):
self.ran = True
target = BooleanTarget()
thread = threading.Thread(target=target)
thread.start()
thread.join()
self.assertTrue(target.ran)
class ThreadJoinOnShutdown(BaseTestCase):

View file

@ -906,7 +906,7 @@ def run(self):
"""
try:
if self._target:
if self._target is not None:
self._target(*self._args, **self._kwargs)
finally:
# Avoid a refcycle if the thread is running a function with

View file

@ -0,0 +1 @@
Allow executing callables that have a boolean value of ``False`` when passed to :class:`Threading.thread` as the target. Patch contributed by Barney Stratford.