我的场景:
我有一个包含链接的变量。例如REMOTE_API = "http://<site>/api/a/b/c"
此链接始终保持不变,因此可以将其视为常量。它被用于程序的许多部分。但是,程序中很少有部分需要更改链接,例如,仅当满足某些条件时才更改REMOTE_API = "http://<site>/api/<user_name>/a/b/c"
。此条件由配置决定。文件可能会更改,恕不另行通知。
有没有办法在运行函数之前更改变量默认值,并在函数结束时切换回来?
例如
@prepare_env(<if condition is met>)
def func():
<...>
call_api(REMOTE_API) # "http://<site>/api/<user_name>/a/b/c"
<...>
if __name__ == "__main__":
call_api_with_default(REMOTE_API) # REMOTE_API = "http://<site>/api/a/b/c"
func() # codition is met REMOTE_API = "http://<site>/api/<user_name>/a/b/c"
an_other_call_with_default(REMOTE_API) # REMOTE_API = "http://<site>/api/a/b/c"
您可以编写一个函数,该函数接受一个函数并调用它,根据需要设置和恢复环境变量。例如:
#!/usr/bin/env python3
# content of env.py
import os
def call_with_env_var(f, var_name, var_value):
old_value = os.environ[var_name]
os.environ[var_name] = var_value
ret = f()
os.environ[var_name] = old_value
def print_var(name):
print(f'value of {name}: {os.environ[name]}')
if __name__ == '__main__':
print_var('HOME')
call_with_env_var(
lambda: print_var('HOME'),
'HOME',
'xyz'
)
print_var('HOME')
$ ./env.py
value of HOME: /home/etuardu
value of HOME: xyz
value of HOME: /home/etuardu
$ echo $HOME
/home/etuardu