如何在Python中管理全局变量

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

我正在一个数据科学项目中,该项目具有大量数据预处理和神经网络实现,并以png文件的形式生成图形。该项目包含近30多种python脚本。我有一组通用值,几乎每个脚本都需要全局使用。

因此,我创建了一个config.yaml文件来存储值,并创建了util.py文件来读取yaml文件并将值分配为全局变量。

config.yaml的一部分

config:
    input_src: "./input_data"
    data_output: "./final_output"
    tempory_src: "./tmp_files"
    neural_network_model_version: "NeuralNet_v1907"
    all_store_output: "/all_store"
    single_store_output: "/individual"

util.py

with open('config.yaml',encoding="utf-8_sig") as f:

    data = yaml.load(f, Loader=yaml.FullLoader)
    global input_src
    global output_src
    global model_version
    global all_store_output
    global single_store_output
    global temp_src
    config=data["config"]

    input_src=config["input_src"]
    output_src=config["data_output"]
    model_version = config["neural_network_model_version"]
    all_store_output= config["all_store_output"]
    single_store_output= config["single_store_output"]

当我导入util文件时,它具有所有全局变量。

我知道拥有很多全局变量不是一个好习惯。我需要知道什么是最合适和推荐的方法来处理这种情况。

python configuration global-variables data-science
1个回答
0
投票

最简单的方法可能是将所有设置都放在一个字典或数据类中。

另一个选择是使用一个函数来加载设置,然后缓存结果:

from functools import lru_cache

import yaml


@lru_cache()
def load_config(config_path='config.yaml'):
    with open(config_path, encoding="utf-8_sig") as f:
        data = yaml.load(f, Loader=yaml.FullLoader)

    # TODO: validate values and calculate related values

    print('Config loaded.')  # Just to show that it only loads once.
    return data['config']

def foo():
    config = load_config()
    print(config['input_src'])

def bar():
    config = load_config()
    print(config['data_output'])

def main():
    foo()
    bar()

main()

如果您不喜欢挖掘该词典以获取所有设置,则可以将所有设置放入类的属性中,或者编写更多函数以从主设置字典中获取每个设置。

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