首页 > 解决方案 > PyDoIt:跨模块共享任务定义

问题描述

这是我面临的问题的一个更简单的版本。我在dodo.py文件中有一个任务。此任务可以访问模块级变量name

# dodo.py
name = 'John'

def task_hello():
    return {
        'actions': [f'echo Hello {name}!']
    }

现在我想要这个任务的不同版本。这样做的一种天真的方法如下。

# dodo1.py
name = 'Tim'

def task_hello():
    return {
        'actions': [f'echo Hello {name}!']
    }

# dodo2.py
name = 'Julia'

def task_hello():
    return {
        'actions': [f'echo Hello {name}!']
    }

我确实想要多个dodo模块。但是,我不想复制任务定义。

请注意,尽管为了简单起见,我在这里只提到了一个任务,但我有一组相互依赖的任务和子任务。另外,我不想使用命令行参数,更喜欢拥有多个config文件。

标签: pythondoit

解决方案


最后我最终做到了这一点。这解决了问题。但我对更优雅的解决方案持开放态度。

dodo1.py

def mk_task_hello(name):
    yield {
        'basename': 'hello',
        'name': 'world',
        'actions': [f'echo Hello {name}!']
    }

dodo2.py

from dodo1 import mk_task_hello

name = 'Tim'


def task_hello():
    yield from mk_task_hello(name)

dodo3.py

from dodo1 import mk_task_hello

name = 'Julia'


def task_hello():
    yield from mk_task_hello(name)

dodo1.py是主要任务实现模块,而dodo2.pydodo3.py是不同的实例。注意basename任务字典中的字段。这是任务依赖项(上面的示例中未显示)正常工作所必需的。


推荐阅读