gpt4 book ai didi

python - 如何动态创建 Luigi 任务

转载 作者:行者123 更新时间:2023-12-03 18:53:42 25 4
gpt4 key购买 nike

我正在为 Luigi Tasks 构建一个包装器,但遇到了 Register 的障碍。类实际上是一个 ABC 元类,当我创建动态 type 时不可选择.

以下代码或多或少是我用来开发动态类的代码。

class TaskWrapper(object):
'''Luigi Spark Factory from the provided JobClass

Args:
JobClass(ScrubbedClass): The job to wrap
options: Options as passed into the JobClass
'''

def __new__(self, JobClass, **options):
# Validate we have a good job
valid_classes = (
ScrubbedClass01,
# ScrubbedClass02,
# ScrubbedClass03,
)
if any(vc == JobClass for vc in valid_classes) or not issubclass(JobClass, valid_classes):
raise TypeError('Job is not the correct class: {}'.format(JobClass))

# Build a luigi task class dynamically
luigi_identifier = 'Task'
job_name = JobClass.__name__
job_name = job_name.replace('Pail', '')
if not job_name.endswith(luigi_identifier):
job_name += luigi_identifier

LuigiTask = type(job_name, (PySparkTask, ), {})

for k, v in options.items():
setattr(LuigiTask, k, luigi.Parameter())

def main(self, sc, *args):
job = JobClass(**options)
return job._run()

LuigiTask.main = main

return LuigiTask

但是,当我运行调用函数时,我得到 PicklingError: Can't pickle <class 'abc.ScrubbedNameTask'>: attribute lookup abc.ScrubbedNameTask failed .

调用函数:

def create_task(JobClass, **options):
LuigiTask = TaskWrapper(JobClass, **options)
# Add parameters
parameters = {
d: options.get(d)
for d in dir(LuigiTask)
if not d.startswith('_')
if isinstance(getattr(LuigiTask, d), luigi.Parameter)
if d in options
}

task = LuigiTask(**parameters)
return task

最佳答案

使用元类 ABC 动态创建类时,模块变为abc ,当一个工作人员试图找到任务时,它会转到抽象基类模块并尝试在那里找到它,但它当然不存在。

为了解决这个问题,通过手动重置 __module__ 确保 luigi 知道在哪里可以找到构建类的代码。多变的。

将行更改为:

LuigiTask = type(job_name, (PySparkTask, ), {'__module__':__name__})

据我所知,这只是 Windows 上的一个问题。

关于python - 如何动态创建 Luigi 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39217180/

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