在python结构启动时隐式调用任务/函数?

在python结构启动时隐式调用任务/函数?,python,fabric,Python,Fabric,每次调用时,我都需要在Fabric中设置一些环境变量,到目前为止,我正在做如下工作: env['FOO'] = 'one' @task def one(): env['FOO'] = 'one' print(cyan('Using FOO %s' % env['FOO'])) @task def two(): env['FOO'] = 'two' print(cyan('Using FOO %s' % env['FOO'])) @task def run()

每次调用时,我都需要在Fabric中设置一些环境变量,到目前为止,我正在做如下工作:

env['FOO'] = 'one'

@task
def one():
    env['FOO'] = 'one'
    print(cyan('Using FOO %s' % env['FOO']))

@task
def two():
    env['FOO'] = 'two'
    print(cyan('Using FOO %s' % env['FOO']))

@task
def run():
    with shell_env(FOO=env['FOO']):
    local(...)

# more tasks that have the same pattern as run() above
首先,我想提供一种更好的自动设置FOO的机制,如果没有调用“one”或“two”。也许有一些隐式的“设置”任务或方法在每次结构运行时都会被调用

另外,实际上有更多的FOO设置(总共10个),当找不到任务时是否有调用通用任务/方法?类似于一网打尽的东西,比如:

def catchall(name, *args, **kwargs):
    if name in ['one', 'two', ...]:
        env['FOO'] = name

您可以使任务成为自定义类的子类,该类具有作为参数传递的某些属性:

from fabric.api import task
from fabric.tasks import Task

class CustomTask(Task):
    def __init__(self, func, *args, **kwargs):
        super(CustomTask, self).__init__(*args, **kwargs)
        self.func = func
        self.foo = "one"

    def run(self, *args, **kwargs):
        return self.func(self.foo, *args, **kwargs)

@task(task_class=CustomTask)
def one(foo):
    print(cyan('Using FOO %s' % foo))

这很奇怪,但由于某种原因,如果我将自定义任务继承的任务指定为fab的参数,则会隐式和双重地调用自定义任务