複数の環境変数をまとめて取得したい(Python)
やりたかったこと
上記の記事を参考にスクレイピングの練習をしていたところ、次のような部分がありました。
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()
としているのは環境変数を大文字で保存しているため。)
余談
書いといてなんですが、普通はこういう時わざわざループさせないのかもしれないなぁと思いました。
でも思った通りに動いて嬉しかったのでメモ。