为什么从方法参数中的环境变量读取会在python中给出None或默认值.环境变量是在调用之前设置的



**虽然名称是在环境变量中设置的,但它会打印默认值**

import os
def test(name: str = os.environ.get('name_config', "dns")):
print("function env is:", os.getenv('name_config'))
print("name is ::", name)
if __name__ == "__main__":
os.environ['name_config']= "john"
print("env is:", os.getenv('name_config'))
#print(os.environ)
test()
test("test-name")

~~

我得到的结果非常有意义:

env is: john
function env is: john
name is :: dns
function env is: john
name is :: test-name

第一行由打印

print("env is:", os.getenv('name_config'))

这是有道理的,因为你只是在前一行把它设置为"john"。

第二行由打印

print("function env is:", os.getenv('name_config'))

出于同样的原因,这也是有道理的——这仍然是那个值,因为它稍后会被调用,并且环境变量不会更改。

第三行由打印

print("name is ::", name)

这会打印name的值,它是函数的参数,被称为:

test()

由于您没有提供值,名称将具有默认值,该值为:

def test(name: str = os.environ.get('name_config', "dns")):

因此,在定义函数时,它将是os.environ.get('name_config', "dns")。这是在您将其更改为"john"之前,显然没有name_config变量,因此您将获得默认值。

这可能是让你感到困惑的主要原因,正如其他人所说,关键是def语句中的值是在第一次执行def时(即定义函数时(求值的,而不是在调用函数时求值的。

第四行由打印

print("function env is:", os.getenv('name_config'))

第二次调用此函数后:

test("test-name")

由于您刚刚再次获得环境变量,因此在这一点上它仍然是"john"。

最后,第五行由打印

print("name is ::", name)

这是同一调用的一部分,但由于您现在为name提供了一个显式值,即'test-name',因此将打印该值。

那么,一切都有意义吗?

参数的默认值是在定义函数时计算的。由于os.environ['name_config']= "john"要在def test(name: str = os.environ.get('name_config', "dns")):运行之后才能求值,并且在修改之前锁定在值中,因此看不到其效果。如果你想这样做,可以推迟默认值的解析,直到函数真正运行,例如:

def test(name: str = ""):  # "" is just an arbitrary string value we assume the user wouldn't use
if not name:
name = os.environ.get('name_config', 'dns')
print("function env is:", os.getenv('name_config'))
print("name is ::", name)

最新更新