From b9fae9d2b5434ca15a9c6e5bf102402bc66dd8d1 Mon Sep 17 00:00:00 2001 From: donBarbos Date: Sun, 19 Oct 2025 11:34:26 +0400 Subject: [PATCH 1/2] [multiprocessing] Clarify incomplete popen types --- stdlib/multiprocessing/context.pyi | 11 +++++++++-- stdlib/multiprocessing/heap.pyi | 9 +++++++-- stdlib/multiprocessing/reduction.pyi | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/stdlib/multiprocessing/context.pyi b/stdlib/multiprocessing/context.pyi index 03d1d2e5c220..377cbe9cc009 100644 --- a/stdlib/multiprocessing/context.pyi +++ b/stdlib/multiprocessing/context.pyi @@ -201,6 +201,13 @@ if sys.platform != "win32": Process: ClassVar[type[ForkServerProcess]] def _force_start_method(method: str) -> None: ... -def get_spawning_popen() -> Any | None: ... -def set_spawning_popen(popen: Any) -> None: ... + +if sys.platform != "win32": + def get_spawning_popen() -> popen_forkserver.Popen | popen_spawn_posix.Popen | None: ... + def set_spawning_popen(popen: popen_forkserver.Popen | popen_spawn_posix.Popen | None) -> None: ... + +else: + def get_spawning_popen() -> popen_forkserver.Popen | popen_spawn_win32.Popen | None: ... + def set_spawning_popen(popen: popen_forkserver.Popen | popen_spawn_win32.Popen | None) -> None: ... + def assert_spawning(obj: Any) -> None: ... diff --git a/stdlib/multiprocessing/heap.pyi b/stdlib/multiprocessing/heap.pyi index 38191a099f1e..2f4a13a9eb60 100644 --- a/stdlib/multiprocessing/heap.pyi +++ b/stdlib/multiprocessing/heap.pyi @@ -1,7 +1,7 @@ import sys -from _typeshed import Incomplete from collections.abc import Callable from mmap import mmap +from multiprocessing import popen_forkserver, popen_spawn_posix, resource_sharer from typing import Protocol, type_check_only from typing_extensions import TypeAlias @@ -24,7 +24,12 @@ if sys.platform != "win32": class _SupportsDetach(Protocol): def detach(self) -> int: ... - def reduce_arena(a: Arena) -> tuple[Callable[[int, _SupportsDetach], Arena], tuple[int, Incomplete]]: ... + def reduce_arena( + a: Arena, + ) -> tuple[ + Callable[[int, _SupportsDetach], Arena], + tuple[int, popen_forkserver._DupFd | popen_spawn_posix._DupFd | resource_sharer.DupFd], + ]: ... def rebuild_arena(size: int, dupfd: _SupportsDetach) -> Arena: ... class Heap: diff --git a/stdlib/multiprocessing/reduction.pyi b/stdlib/multiprocessing/reduction.pyi index 490ae195c20e..1a7b322ee859 100644 --- a/stdlib/multiprocessing/reduction.pyi +++ b/stdlib/multiprocessing/reduction.pyi @@ -6,7 +6,7 @@ from abc import ABCMeta from builtins import type as Type # alias to avoid name clash from collections.abc import Callable from copyreg import _DispatchTableType -from multiprocessing import connection +from multiprocessing import connection, popen_forkserver, popen_spawn_posix, resource_sharer from socket import socket from typing import Any, Final @@ -50,7 +50,7 @@ else: def send_handle(conn: HasFileno, handle: int, destination_pid: Unused) -> None: ... def recv_handle(conn: HasFileno) -> int: ... def sendfds(sock: socket, fds: list[int]) -> None: ... - def DupFd(fd: int) -> Any: ... # Return type is really hard to get right + def DupFd(fd: int) -> popen_forkserver._DupFd | popen_spawn_posix._DupFd | resource_sharer.DupFd: ... # These aliases are to work around pyright complaints. # Pyright doesn't like it when a class object is defined as an alias From 31411b89dabafbacfdb5f7c48df5cab73af257a9 Mon Sep 17 00:00:00 2001 From: donBarbos Date: Sun, 19 Oct 2025 11:38:17 +0400 Subject: [PATCH 2/2] Fix win32 spawning_popen return type --- stdlib/multiprocessing/context.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/multiprocessing/context.pyi b/stdlib/multiprocessing/context.pyi index 377cbe9cc009..ee2569cd4efa 100644 --- a/stdlib/multiprocessing/context.pyi +++ b/stdlib/multiprocessing/context.pyi @@ -207,7 +207,7 @@ if sys.platform != "win32": def set_spawning_popen(popen: popen_forkserver.Popen | popen_spawn_posix.Popen | None) -> None: ... else: - def get_spawning_popen() -> popen_forkserver.Popen | popen_spawn_win32.Popen | None: ... - def set_spawning_popen(popen: popen_forkserver.Popen | popen_spawn_win32.Popen | None) -> None: ... + def get_spawning_popen() -> popen_spawn_win32.Popen | None: ... + def set_spawning_popen(popen: popen_spawn_win32.Popen | None) -> None: ... def assert_spawning(obj: Any) -> None: ...