Подтвердить что ты не робот

Какова хорошая практика для проверки наличия или отсутствия экологической переменной?

Я хочу проверить свою среду на наличие переменной, скажем "FOO", в Python. Для этой цели я использую стандартную библиотеку os. Прочитав библиотечную документацию, я выяснил два способа достижения своей цели:

Способ 1:

if "FOO" in os.environ:
    pass

Способ 2:

if os.getenv("FOO") is not None:
    pass

Я хотел бы знать, какой метод, если он есть, является хорошим/предпочтительным условием и почему.

4b9b3361

Ответ 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'))"