为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英4014372 2023-09-19 14:49:17
希望这个术语是正确的。我有这个装饰器函数,它读取一个文本文件: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_commandsdef 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
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

你不能,至少你的装饰器的编写方式是这样。当你装饰一个函数时,它类似于:


def execute_multi_commands(command, count):

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

    os.system(command)

    count += 1


execute_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

...但这意味着每次调用修饰函数时都会读取该文件,这与您之前所做的略有不同。


查看完整回答
反对 回复 2023-09-19
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信