os.getenv не работает как значение по умолчанию для параметра функции, если установлено в python - PullRequest
0 голосов
/ 04 марта 2020

С помощью следующего кода я ожидаю, что func1 напечатает значение хоста (5000), которое я установил дважды.

import os

def func1(host = os.getenv("HOST")):
    print(host)
    print(os.getenv("HOST"))

os.environ["HOST"] = "5000"
func1()

Вывод:

None
5000

Странно. Давайте проверим весь список переменных env.

def func2(env = os.environ):
    print(env)

os.environ["HOST"] = "5000"
func2()

Вывод:

environ({..., 'Host': '5000'})

Ладно, очень странно, поэтому я могу взять его, используя окружающую среду?

def func3(host = os.environ["HOST"]):
    print(host)

os.environ["HOST"] = "5000"
func3()

Вывод:

Traceback (most recent call last):
  File "mytest.py", line 10, in <module>
    def func3(host = os.environ["HOST"]):
  File "/Users/me/.pyenv/versions/3.7.3/lib/python3.7/os.py", line 678, in __getitem__
    raise KeyError(key) from None
KeyError: 'HOST'

Я что-то упустил, или это ошибка с python?

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Я считаю, что значения по умолчанию устанавливаются во время выполнения, а не при вызове функции. Поэтому, если вы установите переменную окружения выше объявления функции, она будет работать.

import os

os.environ["test"] = "test"

def foo(bar=os.environ["test"]):
     print(bar)
     print(os.environ["test"])

foo()

Вывод:

test
test
0 голосов
/ 04 марта 2020

Значения функции по умолчанию оцениваются, когда функция определена . Если вы добавите строку в ваш скрипт

import os


<b>print(os.getenv("HOST"))</b>


def func1(host = os.getenv("HOST")):
    print(host)
    print(os.getenv("HOST"))


os.environ["HOST"] = "5000"
func1()

, вы получите предварительный просмотр значения по умолчанию для параметра host. Это значение HOST, унаследованное от родительского процесса, или None, если HOST в данный момент вообще отсутствует в среде.

...