如何将kwargs从装饰器传递到装饰器?

时间:2020-08-22 08:58:11

标签: python nested python-decorators keyword-argument args

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

第二个获取文件列表并返回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) 

它在这种情况下也应该起作用,并将“文件”参数从第一个传递到第二个。在这里我需要您的帮助。

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

0 个答案:

没有答案