Python中的应用程序配置文件

Lok*_*wal 5 python class

我正在设计一个多租户工作负载自动化软件(可自动运行Jobs的软件)。为此,我正在创建一个默认的Job配置类。默认情况下,此类中指定的配置将应用于所有类型的作业。

租户(作业的所有者)可以选择针对其特定类别的作业覆盖这些默认配置。

例如:

# Default configurations for all types of Jobs
class DefaultConfigurations:

    def __init__(self, job_defintion):
        self.job_state_database = DEFAULT_DB
        self.job_definition_repository_type = DEFAULT_REPO
        .... 
        # there will be 100's of configurations like this. 
Run Code Online (Sandbox Code Playgroud)

现在,如果某些租户想要为其特定类型的作业覆盖默认应用程序配置,则他们可以继承DefaultConfiguration类并覆盖他们想要覆盖的配置。

例如:

# These overridden configurations will be applied to all the HiveJobs.
class HiveJobs(DefaultConfigurations):

     def __init__(self, job_definition):
        self.job_state_database = "sql"
        self.job_definition_repository_type = "svn"

# These overridden configurations will be applied to all the SparkJobs.
class SparkJobs(DefaultConfigurations):

     def __init__(self, job_definition):
        self.job_state_database = "MongoDb"   
        if (job_definition.technology == "Old")
            self.job_state_database = "sql"  
Run Code Online (Sandbox Code Playgroud)

对于所有其他类型的作业,将使用默认配置。

各个作业也有其定义(以XML形式提及)。在单个作业定义XML文件中,还指定了作业类。例如,Hive Job将在其定义中将其类指定为“ hive”。

一个配置单元作业的job_definition文件示例:

<job_definition>

    name hello_world_from_hive
    class hive
    command echo "hello world from Hive"

    cron_schedule 5 4 * * * 

</job_defintion>
Run Code Online (Sandbox Code Playgroud)

在运行时,Job Executor将检查其定义文件中指定的Job类,并相应地选择配置类(例如,上例中的DefaultConfigurations,HiveJobs或SparkJobs)。

Job执行程序将从XML文件构造一个job_definition对象,并将该Job定义对象传递给相应的配置类,以获取执行此作业所需的最终配置。这是必需的,因此也可以基于某些运行时参数来添加/删除某些配置。请注意,首选项将优先于各个作业定义文件中覆盖的配置。

我不确定以上方法是否是用Python编写此类配置文件的最佳方法。

Bla*_*ght -2

您可以使用ConfigParser,它非常易于使用,例如:

import configparser
config = configparser.ConfigParser()
config['job'] = {};
config['job']['state_database'] = 'DEFAULT_DB';
config['job']['definition_repository_type'] = 'DEFAULT_REPO';
with open('example.ini', 'w') as configfile:
  config.write(configfile)
# and read
config.read('example.ini')
print(config.sections())
print(config['job']['state_database'])
Run Code Online (Sandbox Code Playgroud)