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


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

Способ 1:

if "FOO" in os.environ:
    pass

Способ 2:

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

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

2   51   2016-11-19 23:59:57

2 ответа:

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

вы пытаетесь увидеть, если что-то присутствует наenviron, С чего бы тебе 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") если вы действительно хотите сделать что-то со стоимостью вы могли получить.

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

корпус 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)