2020年8月18日火曜日

python の環境変数を文字列以外の型で受け取るコツ

概要

python の環境変数の読み込みはいくつかの方法があります
どの方法でも読み込み後は文字列として処理されます
一度読み込んだあとにキャストすれば良いのですが面倒です
今回は読み込み時に型変換して使う方法を紹介します

環境

  • macOS 10.15.6
  • Python 3.8.3

サンプルコード

import os

str_val = os.environ.get("STR_VAL", "hoge")
print(str_val)
print(str_val.__class__)

int_val = int(os.environ.get("INT_VAL", 5))
print(int_val)
print(int_val.__class__)

from distutils.util import strtobool

bool_val = strtobool(os.environ.get("BOOL_VAL", "True"))
print(bool_val)
print(bool_val.__class__)

list_val = os.environ.get("LIST_VAL", "1,2,3").split(",")
print(list_val)
print(list_val.__class__)

import json

dict_val = json.loads(os.environ.get("DICT_VAL", '{"key":"value"}'))
print(dict_val)
print(dict_val.__class__)

list_val2 = json.loads(os.environ.get("LIST_VAL2", '["1", "2", "3"]'))
print(list_val2)
print(list_val2.__class__)

動作確認

  • STR_VAL=fuga python3 test.py
  • INT_VAL=100 python3 test.py
  • BOOL_VAL=False python3 test.py
  • LIST_VAL="3,4,5" python3 test.py
  • DICT_VAL='{"key2":"value2"}' python3 test.py
  • LIST_VAL2='["a",4,5]' python3 test.py

解説

基本は各型にキャストすれば OK です
bool や list, dict は少し特殊です
list は split を使っていますが dict 同様に json.loads でも OK です
bool は True ならば「1」Falseならば「0」として扱われます

今回の場合の問題点はキャストできない型の値が環境変数にセットされていると Exception が発生する点です

0 件のコメント:

コメントを投稿