**虽然名称是在环境变量中设置的,但它会打印默认值**
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)