fix: pre-bind handle variables to avoid Python 3.14 NameError in closure cells#1528
Open
rmotgi1227 wants to merge 1 commit into
Open
Conversation
…alio#1517) Python 3.14 changed asyncio.Task to eagerly inspect a coroutine's closure cells when task.set_name() is called (CPython issue gh-126004). If a closure cell is unbound at that moment the interpreter raises: NameError: cannot access free variable 'handle' where it is not associated with a value in enclosing scope Three places in _outbound_schedule_activity, _outbound_start_child_workflow, and _outbound_start_nexus_operation all declared 'handle' as a bare type annotation (no binding), created a coroutine that closes over it, and then passed that coroutine to the handle's constructor -- which triggered task naming before the outer assignment completed. Fix: initialise each handle variable to cast(<Type>, None) immediately before defining the coroutine. The cell is now bound (to None) so the eager inspection succeeds. The coroutine is only ever awaited after the outer handle = <Constructor>(...) line completes, so by the time any code inside run_activity / run_child / operation_handle_fn executes the variable holds the correct object.
|
Rishab Motgi seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account. You have signed the CLA already but the status is still pending? Let us recheck it. |
1 similar comment
|
Rishab Motgi seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account. You have signed the CLA already but the status is still pending? Let us recheck it. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes #1517.
Python 3.14 changed
asyncio.Taskto eagerly inspect a coroutine's closure cells whentask.set_name()is called (CPython gh-126004). If a cell is unbound at that moment the interpreter raises:Three methods in
_workflow_instance.pyhad this pattern:The same pattern exists in
_outbound_start_child_workflow(_ChildWorkflowHandle) and_outbound_start_nexus_operation(_NexusOperationHandle).Fix
Replace the bare annotation with a
cast-annotated assignment:castis already imported; it is a no-op at runtime (returns its second argument) but preserves the static type. By the time the coroutine actually runs, the outerhandle = _ActivityHandle(...)line has completed and the variable holds the real object, so no code ever observes the temporaryNone.Changes
temporalio/worker/_workflow_instance.py_outbound_schedule_activity_ActivityHandlehandle: _ActivityHandle→handle = cast(_ActivityHandle, None)_outbound_start_child_workflow_ChildWorkflowHandle_outbound_start_nexus_operation_NexusOperationHandle[OutputT]Test plan
NameErroron Python 3.14python -m pytest tests/)