New semanal: Spurious "no binding for nonlocal"
オープン
まだ誰も着手していません。
bug
false-positive
priority-1-normal
semantic-analyzer
topic-runtime-semantics
topic-variable-scope
- 主要言語
- Python
- スター
- 20.6k
- フォーク
- 3.3k
- PR マージ指標
- PR 指標を取得中
説明
$ cat santa/scheduler/loop.py
import signal
from typing import Any
def loop() -> None:
def signal_handler(signum: Any, frame: Any) -> None:
nonlocal running
running = False
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
running = True
while running:
pass
$ mypy --new-semantic-analyzer santa/scheduler/loop.py
santa/scheduler/loop.py:7: error: No binding for nonlocal 'running' found
This code passes under the old semantic analyzer. The error goes away if I move the running = True line above the definition of the nested function.
It doesn't seem unreasonable to me to require that the definition of a variable is lexically before its use as a nonlocal, so maybe this doesn't need to be fixed.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
santa/scheduler/loop.py の再現コードから始め、mypy --new-semantic-analyzer を実行して、結果を古いセマンティックアナライザーの結果と比較します。外側の関数に後から導入された nonlocal バインディングを受け入れるべきかどうかを判断します。動作が確定し、報告される診断がその判断と一致すれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 45/100