Python 如何将kwargs从一个装饰者传递到另一个装饰者?

Python 如何将kwargs从一个装饰者传递到另一个装饰者?,python,nested,python-decorators,keyword-argument,args,Python,Nested,Python Decorators,Keyword Argument,Args,我被要求建造两个装饰师: 其中之一是读取目录和她的sub中的所有文件,并返回与它作为参数获得的模式匹配的文件名。 它将它们作为“files”参数返回给包装函数 第二个获取文件列表并返回一个dict,其中键是文件名,值是文件内容 在这里之前,我做了所有我被要求做的事情 问题的下一部分是将文件从第一个生成器传递到第二个生成器,并执行第二个可选参数-我的意思是,如果第二个生成器用第一个修饰,它不应该在第二个修饰器中获取任何参数,并从第一个生成器获取文件列表。 我卡住了 这就是装饰师: 第一: from

我被要求建造两个装饰师: 其中之一是读取目录和她的sub中的所有文件,并返回与它作为参数获得的模式匹配的文件名。 它将它们作为“files”参数返回给包装函数

第二个获取文件列表并返回一个dict,其中键是文件名,值是文件内容

在这里之前,我做了所有我被要求做的事情

问题的下一部分是将文件从第一个生成器传递到第二个生成器,并执行第二个可选参数-我的意思是,如果第二个生成器用第一个修饰,它不应该在第二个修饰器中获取任何参数,并从第一个生成器获取文件列表。 我卡住了

这就是装饰师:

第一:

from pathlib import Path
import fnmatch
import os
import glob


def find(*args):
    def inner(f):
        files = []

        def wrapper(*wrapper_args, **kwargs):
            p = Path("./")
            for folder in p.glob("**"):
                for file in os.listdir(folder):
                    for arg in args:
                        if fnmatch.fnmatch(file, arg):
                            files.append(file)
            return f(files=files, *wrapper_args, **kwargs)

        return wrapper()

    return inner


@find("*.py", "*.txt")
def file_printer(files):
    print(files) 
第二点:

def read_file(path):
    with open(path, "r") as f:
        f = f.read()
        return f


def use(**use_kwargs):
    def inner(f):
        content = {}

        def wrapper(*wrapper_args, **kwargs):
            p = Path("./")
            for folder in p.glob("**"):
                for file in use_kwargs.get("files"):
                    if file in os.listdir(folder):
                        file_path = f"{folder}/{file}"
                        content[file_path] = read_file(file_path)

            return f(content=content, *wrapper_args, **kwargs)

        return wrapper()

    return inner


@use(files=["cat.py", "dog.py"])
def file_printer(content):
    print(content) 
在这种情况下,它也应该工作,并将“files”参数从第一个传递到第二个。我需要你的帮助

@find("*.py", "*.txt")
@use
def file_printer(content):
    print(content)
 

您可以同时使用
*args
**kwargs
,请参见此处如何:感谢您的评论,但我不明白为什么它与我被问到的类似。当然,我试图添加“use”函数*args和“files”之类的东西,但没有成功@mkrieger1您可以同时使用
*args
**kwargs
,请参见此处如何:感谢您的评论,但我不明白为什么它与我被问到的类似。当然,我试图添加“use”函数*args和“files”之类的东西,但没有成功@mkrieger1