【Python】globalで環境変数を呼ぶことの罪

環境変数をglobalで読むコードを書く人がいるが、私はそれに関して完全にアンチである

※念の為書くが、決して環境変数自体を否定したいわけではない

環境変数をglobalで読むことで生まれる被害

  • importしただけで評価されるので使ってなくても要求される
  • 忘れがちで、2度手間を生む
  • テストが冗長になる(環境変数にあることがテストできるわけではないのに環境変数を読むためのコードが必要になる)
  • 書き換えると他のテストに影響を出す可能性がある

どれも小手先(環境でif分岐したり、環境変数を戻したり)でどうにかできる被害かもしれない。

でも塵が積もると山になって、単体テストのモチベーションを下げ、テストをやらなくなるのだ

じゃあどうするの?

ケースによるが僕ならたとえばこうする

class Hoge:
    def __init__(self, a, b):
        ...

    @staticmethod
    def from_env() -> Hoge:
        _a = os.environ[...]
        _b = os.environ[...]
        return Hoge(_a, _b)

from_envのようなメソッドを作成してその中で読む

こうすることで、単体テストの範囲では、環境変数が不要になる。

from_envをmockにしてしまうことも可能である

環境変数に入っているかという観点のテストは?

そもそも、その観点は単体テストでは確認不可能であるQED

p.s. クラス変数の初期化で代入するのも同じ罪です。いつその環境変数を読むコードが評価されるのかを考えましょう