猿问

当我调用内部/装饰函数时,我可以将参数传递到装饰器函数中吗?

希望这个术语是正确的。我有这个装饰器函数,它读取一个文本文件:


def read_commands(inner, path=BATCH_PATH):

    with open(path) as f:

        commands = ['python ' + line.replace('\n', '') for line in f]


    def wrapper(*args, **kwargs):

        for command in commands:

            inner(command, *args, **kwargs)


    return wrapper

这是它装饰的功能之一:


@read_commands

def execute_multi_commands(command, count):

    LOG.info(f'Executing command {count}: {command}')

    os.system(command)

    count += 1

我希望能够在调用时更改默认路径execute_multi_commands,就像我的main:


def main():

    parser = argparse.ArgumentParser()


    parser.add_argument('-b', '--batch', action='store', type=str, dest='batch')

    args = parser.parse_args()

    

    count = 1

    execute_multi_commands(count, path=args.batch)

然而,显然这不起作用,因为pathis not a argument in execute_multi_commands. 当我调用时,我是否可以传递path给装饰器函数?- 或者,更有可能的是,任何功能等效的替代方案?read_commandsexecute_multi_commands


慕桂英4014372
浏览 93回答 1
1回答

白猪掌柜的

你不能,至少你的装饰器的编写方式是这样。当你装饰一个函数时,它类似于:def execute_multi_commands(command, count):    LOG.info(f'Executing command {count}: {command}')    os.system(command)    count += 1execute_multi_commands = read_commands(execute_multi_commands)所以在这之后,read_commands已经被执行了,并且文件已经被读取了。您可以做的是更改装饰器以读取包装器中的文件,例如:def read_commands(inner, path=BATCH_PATH):    def wrapper(*args, **kwargs):        if "path" in kwargs:            path_ = kwargs.pop("path")        else:            path_ = path        with open(path_) as f:            commands = ['python ' + line.replace('\n', '') for line in f]        for command in commands:            inner(command, *args, **kwargs)    return wrapper...但这意味着每次调用修饰函数时都会读取该文件,这与您之前所做的略有不同。
随时随地看视频慕课网APP

相关分类

Python
我要回答