python / python/cpython

NameError: Value not defined in two threads-only pool tests when ctypes is unavailable

オープン
#155,332 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

tests topic-multiprocessing
主要言語
Python
スター
77.2k
フォーク
35.9k
PR マージ指標
PR 指標を取得中

説明

In Lib/test/_test_multiprocessing.py, both
test_imap_and_imap_unordered_when_buffer_is_full and
test_imap_and_imap_unordered_with_buffersize_when_buffer_is_full create a
shared value with a module-level Value:

last_produced_task_arg = Value("i")

But Value is only conditionally imported at the top of the module:

try:
    from multiprocessing.sharedctypes import Value, copy
    HAS_SHAREDCTYPES = True
except ImportError:
    HAS_SHAREDCTYPES = False

So when ctypes/sharedctypes are unavailable (HAS_SHAREDCTYPES == False), the
name Value is undefined. Unlike the other sharedctypes-based tests in this
file (which use @unittest.skipUnless(HAS_SHAREDCTYPES, ...)), these two tests
have no such guard, so they run and raise:

NameError: name 'Value' is not defined. Did you mean: 'self.Value'?

Reproduced in verbose mode as 4 errors (2 tests x {imap, imap_unordered})
when running test_multiprocessing_forkserver.test_threads on a build without
ctypes.

These tests are threads-only (they call skipTest() for other backends), so
self.Value resolves to multiprocessing.dummy.Value and does not depend on
ctypes. Replacing Value("i") with self.Value("i", 0):

  • fixes the NameError on builds without ctypes, and
  • matches how the rest of the suite creates shared values. Since both
    forms initialize the value to zero, there is no behavior change when
    ctypes is available.

Proposed fix:

- last_produced_task_arg = Value("i")
+ last_produced_task_arg = self.Value("i", 0)

This is my first contribution to CPython. I used Claude and opencode to help
me understand the codebase, and vim to edit the file. I reviewed and tested
the change myself; please let me know if I missed any process step

Linked PRs
  • gh-155333

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

Lib/test/_test_multiprocessing.py から始め、test_imap_and_imap_unordered_when_buffer_is_full と test_imap_and_imap_unordered_with_buffersize_when_buffer_is_full を調べます。ctypes なしのビルドで test_multiprocessing_forkserver.test_threads を実行します。両方のテストで NameError が発生せず、テスト実行が成功すれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
testing
issue の種類
バグ
難易度
1/5
見積もり時間
1時間未満
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。