LoginSignup
9
9

More than 5 years have passed since last update.

from sys import stderr するか、import sys → sys.stderr を呼ぶか

Posted at

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を取得する動作になっていると言えますから、これに振る舞いを揃えたい場合は後者の記述をすればいいということになります。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9