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