Какова хорошая практика для проверки наличия или отсутствия экологической переменной?
Я хочу проверить свою среду на наличие переменной, скажем "FOO"
, в Python. Для этой цели я использую стандартную библиотеку os
. Прочитав библиотечную документацию, я выяснил два способа достижения своей цели:
Способ 1:
if "FOO" in os.environ:
pass
Способ 2:
if os.getenv("FOO") is not None:
pass
Я хотел бы знать, какой метод, если он есть, является хорошим/предпочтительным условием и почему.
Ответы
Ответ 1
Использовать первый; он непосредственно пытается проверить, определено ли что-то в environ
. Хотя вторая форма работает одинаково хорошо, ей не хватает семантически, так как вы получаете значение обратно, если оно существует, и используйте его только для сравнения.
Вы пытаетесь увидеть, присутствует ли что-то в environ
, почему бы вам просто сравнить его и затем отбросить?
То, что делает getenv
:
Получить переменную окружения, вернуть None
, если она не существует. необязательный второй аргумент может указать альтернативное значение по умолчанию.
(это также означает, что ваш чек может быть только 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")
, если вы действительно хотите что-то сделать со значением, которое вы можете получить.
Ответ 2
Существует вариант для любого решения, в зависимости от того, что вы хотите сделать, при условии наличия переменной среды.
Случай 1
Если вы хотите выполнять различные действия исключительно на основе существования переменной среды, не заботясь о ее значении, первое решение является наилучшей практикой. В нем кратко описывается, что вы проверяете: "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)
Ответ 3
Чтобы быть на безопасной стороне, используйте
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'))"