文字列で取れてしまう
お手軽に環境変数を扱える
Pythonを使ってAWSのLambda関数やツールを作成していると、環境変数に設定した値を取得して利用したいというケースが少なからず発生すると思います。
Python3での環境変数の値の取り方は以下のようにとても簡単です。
試しにPYTHONPATHと言う環境変数を取得してみます。
import os
env_var = os.environ.get('PYTHONPATH')
print(env_var)
/Users/blogenist/.pyenv/shims/python
存在しない環境変数を指定した場合はNoneが取得されます。
数値はそのままは使えない
ただ、数値を環境変数にもたせている場合はそのまま使おうとすると以下のようになってしまいます。
export LOOP_COUNT=5
import os
env_var = os.environ.get('LOOP_COUNT')
for index in range(env_var):
print(index)
Traceback (most recent call last):
File "sample.py", line 4, in <module>
for index in range(env_var):
TypeError: 'str' object cannot be interpreted as an integer
✘
これは、os.environで取得した値がint型ではなくstr型で取得されるPythonの仕様のため、そのままではrange関数の引数に使えない、と言う現象になります。
ですので、int型にキャストする必要があるのですが、Python3では簡単にキャストをすることが出来るのでご紹介致します。
手順
int関数を利用
Pythonには文字列を数値に変換するintメソッドが用意されています。
これを利用することで簡単に文字列数字を数値に直すことができます。
import os
env_var = os.environ.get('LOOP_COUNT')
print(f"env_var:{env_var}")
int_val = int(env_var)
print(f"int_val:{int_val}")
for index in range(int_val):
print(index)
env_var:5
int_val:5
0
1
2
3
4
標準出力上は変わりませんが、しっかりとrange関数に渡せるようになりましたね♪
半角文字列数値以外をint関数に渡すとどうなる?
では、実装ミス等が原因でint関数に文字列数字以外を渡してみましょう。
アルファベットの場合
まずはアルファベットの場合です。
import os
env_var = "A"
print(f"env_var:{env_var}")
int_val = int(env_var)
print(f"int_val:{int_val}")
env_var:A
Traceback (most recent call last):
File "sample.py", line 5, in <module>
int_val = int(env_var)
ValueError: invalid literal for int() with base 10: 'A'
✘
予想通りエラーが出ましたね。
全角数値の場合
では、次は全角数値の場合です。
import os
env_var = "1"
print(f"env_var:{env_var}")
# 比較用半角数字
exa_var = "1"
print(f"exa_var:{exa_var}")
int_val = int(env_var)
print(f"int_val:{int_val}")
env_var:1
exa_var:1
int_val:1
なんと動いてしまいました・・・・!
これは予想外でしたね。
あまり使うケースはないとは思いますが、このケースは念頭に入れておいた方が良いかもしれませんね。
終わりに
以上のように、知っておかないとバグが発生してしまいます。
近年はサーバーレスアーキテクチャや人工知能などでPythonが活躍出来る場が増えてきているので、覚えておくと良いでしょう♪
