gpt4 book ai didi

python - Python 中的应用程序配置文件

转载 作者:太空狗 更新时间:2023-10-30 00:58:25 24 4
gpt4 key购买 nike

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

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

例如:

# 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.

现在,如果某些租户想要为其特定类型的作业覆盖默认应用程序配置,他们可以继承 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"

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

个别工作也有其定义(以 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>

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

Job executor 将从 XML 文件构造一个 job_definition 对象,并将该 Job 定义对象传递给相应的配置类,以获得执行此作业所需的最终配置。这是必需的,以便也可以根据某些运行时参数添加/删除某些配置。请注意,将优先考虑在单个作业定义文件中覆盖的配置。

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

最佳答案

只需参数化 __init__ 即可根据需要设置属性值。

class Configuration:
def __init__(self, db, repo_type):
self.job_state_database = db
self.job_definition_repository_type = repo_type

d = Configuration(DEFAULT_DB, DEFAULT_REPO)
hj = Configuration("sql", "svn")

如果您不希望用户手动传递数据库和存储库类型,请定义类方法来包装它们。

class Configuration:
def __init__(self, db, repo_type):
self.job_state_database = db
self.job_definition_repository_type = repo_type

@classmethod
def default_configuration(cls):
return cls(DEFAULT_DB, DEFAULT_REPO)

@classmethod
def hive_configuration(cls):
return cls("sql", "svn")


d = Configuration.default_configuration()
hj = Configuration.hive_configuration()

在这两种情况下,我都看不出有任何理由定义不同的类型来反射(reflect)存储在属性中的信息....除非不同的类型以不再需要显式存储数据库和存储库类型信息的方式覆盖各种方法。 (我们正在进入设计但是,不能仅根据您问题中的信息来判断的问题。)

class Configuration:
def do_something(self):
"""Do stuff using the default database/repo"""

class HiveJob(Configuration):
def do_something(self):
"""Do stuff using sql/svn instead"""

关于python - Python 中的应用程序配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52896984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com