python 中全局变量的最佳实践

问题描述 投票:0回答:2

我在不同的文件中有以下代码。我想了解定义全局变量的最佳做法是什么,这样我就不必再次运行该函数来获取变量值。文件结构如下:

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 个函数彼此不依赖。它们是分开执行的。这个问题的最佳实践是什么?

python function variables
2个回答
1
投票

假设此代码可以是多线程的,您可以使用锁来控制对全局变量的访问。全局资源从

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()
即可。


0
投票

将值保存为模块中的顶级(即全局)变量。

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
函数只在第一次导入时执行

© www.soinside.com 2019 - 2024. All rights reserved.