Pythonで"FOO"
などの変数の存在について自分の環境をチェックしたいです。この目的のために、私はos
標準ライブラリを使用しています。図書館の資料を読んだ後、私は自分の目標を達成するための2つの方法を考え出しました。
方法1:
if "FOO" in os.environ:
pass
方法2:
if os.getenv("FOO") is not None:
pass
どちらの方法が良い/好ましい条件であるか、またその理由を知りたいのですが。
最初を使用してください。何かがenviron
で定義されているかどうかを直接チェックしようとします。 2番目の形式も同様に機能しますが、値が存在する場合は値が返され、onlyと比較するために使用されるため、意味的に欠けています。
がenviron
に存在するかどうかを確認しようとしているのですが、比較のためだけにgetが必要です。それを捨てる?
それがまさにgetenv
がすることです。
環境変数を取得し、存在しない場合は
None
を返します。オプションの2番目の引数は、代替のデフォルトを指定できます。
(これはあなたのチェックがif getenv("FOO")
であることも意味します)
取得したくない、存在を確認したいのです。
どちらにしても、getenv
はenviron.get
の単なるラッパーですが、次のようにマッピングのメンバーシップをチェックしている人はいないでしょう。
from os import environ
if environ.get('Foo') is not None:
要約すると、
if "FOO" in os.environ:
pass
もしちょうどが存在を確認したいのであれば、実際にあなたが得るかもしれない値で何かをしたいのであればgetenv("FOO")
を使用してください。
どちらの解決策でも、環境変数の存在を条件として何をしたいのかによって異なります。
その値を気にせずに、純粋に環境変数の存在に基づいてさまざまなアクションを実行したい場合は、最初の解決策がベストプラクティスです。それはあなたが何をテストしているのかを簡潔に説明しています:環境変数のリストの中の 'FOO'です。
if 'KITTEN_ALLERGY' in os.environ:
buy_puppy()
else:
buy_kitten()
値が環境変数で定義されていない場合にデフォルト値を設定したい場合、2番目の解決策は実際には有用ですが、あなたが書いた形式ではありません。
server = os.getenv('MY_CAT_STREAMS', 'youtube.com')
多分
server = os.environ.get('MY_CAT_STREAMS', 'youtube.com')
アプリケーションにいくつかのオプションがある場合は、 ChainMap
を調べるとよいでしょう。これにより、キーに基づいて複数の辞書をマージすることができます。 ChainMap
のドキュメントにこの例があります。
[...]
combined = ChainMap(command_line_args, os.environ, defaults)
安全側にいるために
os.getenv('FOO') or 'bar'
上記の答えのコーナーケースは、環境変数が設定されているが空の場合です。
この特別な場合には
print(os.getenv('FOO', 'bar'))
# prints new line - though you expected `bar`
または
if "FOO" in os.environ:
print("FOO is here")
# prints FOO is here - however its not
これを避けるためには、単にor
を使ってください。
os.getenv('FOO') or 'bar'
それならあなたは
print(os.getenv('FOO') or 'bar')
# bar
空の環境変数があるのはいつですか?
.env
ファイルに値を設定するのを忘れました
# .env
FOO=
またはとしてエクスポート
$ export FOO=
またはsettings.py
に設定するのを忘れた
# settings.py
os.environ['FOO'] = ''
更新:疑問がある場合は、これらのワンライナーをチェックしてください。
>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"