Pythonコード中で標準エラー出力ストリームのことを記述するには
from sys import stderr
stderr
と書く方法と
import sys
sys.stderr
と書く方法の二通りあります。stderrに限らずimportはすべてそうなのですが。
さてそれらの使い分け。前者の方がループで利用する場合にわずかにパフォーマンスが良くなるなどあるのは置いておいて、意味論的な違いがあります。
- 前者は、このモジュールをロードした時点でstderrへの参照が確定します。
- 後者は、sys.stderrを呼び出すまで参照が確定しません。
何が起こるかというと、ユニットテストのためにcontextlib.redirect_stderr
を使って出力先を差し替えようとしたとき、前者だとモジュールがロード済みならstderrへの参照が確定しているため差し替えが効きません。後者なら処理を実行したときにはじめてsysからstderrを取得するので差し替えが効きます。
素のprint関数はcontextlib.redirect_stdout
で向きを変えられるので、毎回その場でsysからstdoutを取得する動作になっていると言えますから、これに振る舞いを揃えたい場合は後者の記述をすればいいということになります。