ひとメモ

主にプログラミングのメモ

複数の環境変数をまとめて取得したい(Python)

やりたかったこと

qiita.com

上記の記事を参考にスクレイピングの練習をしていたところ、次のような部分がありました。

URL      = "https://qiita.com/login" 
ID       = ""                        
ID_sel   = "#identity"               
PASS     = ""                        
PASS_sel = "#password"               
Selector = ".st-Header_loginUser img"

私は完成したものを公開したい等諸々の理由で、上記全ての変数を環境変数としてos.getenv()で取得する形にしようと思いました。
同じ形が続くのでforループにします。

複数の変数に環境変数の値を代入

初めは次のような形でやろうとしましたが、これだと変数が未定義だというエラーが出ます。

Pythonはvar hoge = ~のように変数を宣言しないので、先にリストにしておくということができませんでした。

ダメコード

conf = [URL, ID, ID_sel, PASS, PASS_sel, Selector]

for i in conf:
    i = os.getenv(str(i).upper())

NameError: name 'URL' is not defined こんなエラーが出ます。
なので、以下のように書き換えたら動くようになりました。

動くコード

conf = ["URL", "ID", "ID_sel", "PASS", "PASS_sel", "Selector"]

for i in conf:
    locals()[i] = os.getenv("{}".format(i.upper()))

まず変数名をstrとしてリストを作っておきます。

次にlocals()を使います。
これは辞書形式でローカル変数を返してくれるそうで(よくわからない)、[i]がキーで変数名、os.getenv("{}".format(i.upper()))が値で各環境変数になります。
upper()としているのは環境変数を大文字で保存しているため。)

余談

書いといてなんですが、普通はこういう時わざわざループさせないのかもしれないなぁと思いました。
でも思った通りに動いて嬉しかったのでメモ。