我在不同的文件中有以下代码。我想了解定义全局变量的最佳做法是什么,这样我就不必再次运行该函数来获取变量值。文件结构如下:
00.py
def f_token():
global v_Token, v_session
auth_context = adal.AuthenticationContext("https://login.microsoftonline.com/common")
token_response = auth_context.acquire_token_with_username_password("https://xxx.xxx.dynamics.com/", username, password, client_id)
v_Token= token_response['accessToken']
return v_Token
01.py
from 00 import*
A_Token = f_token()
def f_meta():
code here
02.py
from 00 import*
A_Token = f_token()
def f_anotherfunction():
code here
03.py
from 00 import*
A_Token = f_token()
def f_function():
code here
我只想执行一次 f_token 并在文件 01,02 和 03 中重用 v_Token 的值。这 3 个函数彼此不依赖。它们是分开执行的。这个问题的最佳实践是什么?
假设此代码可以是多线程的,您可以使用锁来控制对全局变量的访问。全局资源从
None
开始,第一个发现 None
的调用者获得令牌。未来的来电者注意到它不再是None
并跳过额外的工作。
import threading
v_lock = threading.Lock()
v_Token = v_session = None
def f_token():
global v_Token, v_session
# short circuit when token already acquired
if not v_Token:
# lock, verify no race condition, get token
with v_lock.lock():
if v_Token is None:
auth_context = adal.AuthenticationContext("https://login.microsoftonline.com/common")
token_response = auth_context.acquire_token_with_username_password("https://xxx.xxx.dynamics.com/", username, password, client_id)
v_Token = token_response['accessToken']
return v_Token
您可能不希望在其他模块中进行那些模块级
A_Token = f_token()
调用。简单导入通常不应该做像网络身份验证那样引人注目的事情。它使事情难以测试,并且代码通常不太可重用。每次需要令牌时,只需致电f_token()
即可。
将值保存为模块中的顶级(即全局)变量。
module_A.py
-----------
A = something(...)
然后其他模块可以导入该变量:
module_B.py
-----------
from module_A import A
module_C.py
-----------
from module_A import A
something()
里面的module_A.py
函数只在第一次导入时执行