Idea: short-circuit analysis with `if <platform-check>: return`
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 20.6k
- フォーク
- 3.3k
- PR マージ指標
- PR 指標を取得中
説明
Hey all,
I'm adding OS-specific typechecking to a large Python app, and we have a fair number of files and functions that mix OS versions. Currently, mypy only does limited analysis with platform/version/constants to figure out which lines it shouldn't check. With that limited analysis, it's possible to add OS-specific typechecking to the app, but it'll make the code a bit messier.
I'd like to get your feedback on two ideas that would make adding OS-specific typechecking easier.
- For
ifstatements where the expression is a mypy-constant, short-circuit if there's areturnstatement one-level deep in the body of theif. (Currently, the inner bodies of the if are conditionally checked, andreturndoesn't short-circuit checking.)
E.g.
# flags: --always-false=IS_WINDOWS
if IS_WINDOWS:
import win_specific_import
def some_fun_broken() -> int:
if not IS_WINDOWS:
return 1 # checked
# The rest of this function is analyzed even though we returned above.
# Blows up since `win_specific_import` isn't defined
return win_specific_import.something()
def some_fun_fixed() -> int:
if not IS_WINDOWS:
return 1 # checked
else:
# Not analyzed because this is in the `else` part of the `if` statement
return win_specific_import.something() # Works
We use the if not IS_WINDOWS: return pattern a fair amount in our codebase, and it would be nice if mypy supported that.
I'm not sure how we'd implement that in mypy, though. Maybe we can scan for a return one-level deep in if statement bodies which have a mypy-constant expression and mark the rest of the function as unreachable.
- Make mypy-constant asserts also ignore function bodies. This would be an extension of #5308. E.g.
# flags: --always-false=IS_WINDOWS
if IS_WINDOWS:
import win_specific_import
def invalid_win_specific_function() -> bool:
assert IS_WINDOWS
return win_specific_import.some_func() # This blows up
if IS_WINDOWS:
def valid_win_specific_function() -> bool:
return win_specific_import.some_func()
It would be convenient if we ignored the rest of the function body if the first statement in it is a mypy-constant assert. I don't think we'd want to look for asserts elsewhere in the function block, though, even though that would make it a magical special-case.
Any thoughts on the above ideas?
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、条件付きインポートと関数本体について説明されている挙動を含め、mypy に既に存在するプラットフォーム、バージョン、定数の解析を追跡します。提案されている2つの短絡動作のどちらかが望まれているかを判断し、その後、テストと変更を実装する前に、if/return の例と先頭の assert の例についてカバレッジを定義します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- compilers
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 25/100