我编写了一个可以读取数据并将数据写入 .yaml 文件的程序。但现在我面临着将重置设置功能组织为标准的问题。我不知道如何在我的代码中最好地做到这一点...组织这样一个易于理解且简洁的函数的最佳方法是什么?
主要代码文件(settings.py):
from abc import ABC, abstractmethod
from dataclasses import dataclass
from pathlib import Path
from enum import Enum
import yaml
from src.settings.default_settings import JetInjectorConstant, CentrifugalInjectorConstant
class ListNameSettingsFile(Enum):
"""
РУС: Список файлов конфигурации
ENG: List of configuration files
"""
LIST_NAME_SETTINGS_FILE = ["injector_settings"]
@dataclass(frozen=True)
class Settings(ABC):
"""
РУС: Основной класс для обработки файлов конфигурации
ENG: The main class for processing configuration files
"""
@staticmethod
def get_root_dir():
"""
РУС: Директория установки ПО
ENG: The software installation directory
"""
return Path(__file__).absolute().parent
@abstractmethod
def get_data_for_recording(self) -> dict:
"""
РУС: Получение данных для загрузки в файл конфигурации
ENG: Getting data to upload to a configuration file
"""
raise NotImplementedError("Данные настроек не загружены")
@abstractmethod
def name_settings_file(self) -> str:
"""
РУС: Получение имени файла конфигурации
ENG: Getting the name of the configuration file
"""
raise NotImplementedError("Имя файла настроек не загружено")
@property
def save_settings(self) -> None:
"""
РУС: Запись констант в файл конфигурации
ENG: Writing constants to a configuration file
"""
with open((self.get_root_dir() / "data").joinpath(self.name_settings_file() + ".yaml"), "w") as outfile:
new_dump = yaml.dump(self.get_data_for_recording())
outfile.write(new_dump)
return None
@property
def read_settings(self) -> dict:
"""
РУС: Чтение констант из файла конфигурации
ENG: Reading constants from a configuration file
"""
with open((self.get_root_dir() / "data").joinpath(self.name_settings_file() + ".yaml"), "r") as stream:
read_date = yaml.safe_load(stream)
return read_date
@dataclass(frozen=True)
class InjectorSettings(Settings):
"""
РУС: Класс констант для проведения расчетов
ENG: A class of constants for performing calculations
"""
laminar: float | None = None
turbulent: float | None = None
right_angle: float | None = None
def get_data_for_recording(self) -> dict:
"""
РУС: Загрузка констант для расчетов
ENG: Loading constants for calculations
"""
injector_settings = {
"reynolds": {"laminar": self.laminar, "turbulent": self.turbulent},
"right_angle": self.right_angle,
}
return injector_settings
def name_settings_file(self) -> str:
"""
РУС: Передача имени файла конфигурации
ENG: Passing the name of the configuration file
"""
return ListNameSettingsFile.LIST_NAME_SETTINGS_FILE.value[0]
具有标准设置的文件(default_settings.py):
from enum import Enum
class JetInjectorConstant(Enum):
"""Стандартные значение констант струйной """
LAMINAR = 2000
TURBULENT = 10_000
class CentrifugalInjectorConstant(Enum):
"""Стандартные значение констант центробежной форсунки"""
RIGHT_ANGLE = 90
更新:
在这个项目结构中,我们不是将数据存储在文件中default_settings.yaml,而是将数据存储在文件中default_settings.py,如果不小心删除了这样的文件.yaml,这将导致软件彻底崩溃,如果在程序内部发现了这些数据,将能够恢复其运作。
该文件settings.yaml将存储负责计算边界和启动程序的设置的设置。它们在程序启动时使用一次,并且不会进一步使用。也就是说,如果您在运行期间更改它们,这不会以任何方式影响程序的运行。
需要设置重置系统,以便如果输入了错误的数据,可以返回到程序安装状态(标准设置)。如果在尝试打开文件时,由于文件结构损坏或与无法打开或读取文件相关的其他错误而导致程序无法执行此操作,也会激活重置系统。
重置为默认设置:
输出: