it-roy-ru.com

Какова хорошая практика, чтобы проверить, существует ли переменная среды или нет?

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

Способ 1:

if "FOO" in os.environ:
    pass

Способ 2:

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

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

86
Kshitij Saraogi

Используйте первое; он напрямую пытается проверить, определено ли что-то в environ. Хотя вторая форма работает одинаково хорошо, в ней семантически не хватает, поскольку вы возвращаете значение, если оно существует, и только используете его для сравнения.

Вы пытаетесь увидеть, если что-то присутствует inenviron, почему бы вам get просто сравнить это и затем отбросить?

Это именно то, что делает 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"), если вы действительно хотите что-то сделать со значением, которое вы можете получить.

105
Jim Fasarakis Hilliard

Существует вариант для любого решения, в зависимости от того, что вы хотите сделать, при условии наличия переменной среды.

Случай 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)
14
hugovdberg

Чтобы быть на безопасной стороне, используйте

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'))"
6
Levon