Как управлять глобальными переменными в Python - PullRequest
0 голосов
/ 11 октября 2019

Я работаю над проектом по науке о данных, который имеет много предварительной обработки данных и реализацию нейронной сети и генерирует графики в виде файлов 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"]

когдаЯ импортирую файл утилит, в котором есть все глобальные переменные.

Я знаю, что иметь большое количество глобальных переменных не очень хорошая практика. Мне нужно знать, какой способ работы лучше всего подходит и рекомендуется.

1 Ответ

0 голосов
/ 14 октября 2019

Самый простой подход, вероятно, состоит в том, чтобы поместить все настройки в один словарь или класс данных.

Другой вариант - использовать функцию для загрузки настроек, а затем кэшировать результаты:

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()

Если вам не нравится копаться в этом словаре, чтобы получить все настройки, вы можете поместить все настройки в свойства класса или написать дополнительные функции для извлечения каждого параметра из словаря основных настроек.

...