From: BarneyStratford Date: Tue, 2 Feb 2021 20:24:24 +0000 (+0000) Subject: bpo-41149: Fix a bug in threading that causes fals-y threads callables to fail to... X-Git-Tag: v3.10.0a5~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=01c4fddc4b2ac707f226e0bd92679588d2252cc4;p=thirdparty%2FPython%2Fcpython.git bpo-41149: Fix a bug in threading that causes fals-y threads callables to fail to start. (GH-21201) --- diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 0a4372ec2df3..a7a716ed59fc 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -855,6 +855,26 @@ class ThreadTests(BaseTestCase): """) 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): diff --git a/Lib/threading.py b/Lib/threading.py index 7b3d63dd211e..ff2624a3e1e4 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -906,7 +906,7 @@ class Thread: """ 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 diff --git a/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst b/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst new file mode 100644 index 000000000000..abe09016a652 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst @@ -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.