我被要求建造两个装饰器: 其中之一是读取目录及其子目录中的所有文件,并返回与其作为参数获取的模式匹配的文件名。 它将它们作为包装函数的“文件”参数返回。
第二个获取文件列表并返回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)