首页 > 解决方案 > 如何使用堆叠在 python 中的相同装饰器?

问题描述

我有一个检查文件验证的装饰器

def check_file(*args, **kwargs):
    def wrapper(f):
        file_path = os.path.join(kwargs['path'], kwargs['file_name'])
        if os.path.exists(file_path):
            print("{} Exist".format(kwargs['file_name'])
        else:
            print("{} Not Exist".format(kwargs['file_name'])
        f()
    return wrapper

我想要装饰器的功能,

@check_file(path=os.getcwd(), file_name="foo.txt")
@check_file(path=os.getcwd(), file_name="bar.txt")
@check_file(path=os.getcwd(), file_name="hello.txt")
@check_file(path=os.getcwd(), file_name="world.txt")
def read_file():
    print("It will be decorated")

我知道装饰器有一个执行顺序,但是,它似乎只执行最后一个(“world.txt”)。如何执行所有相同的装饰器?

*我使用的是Python3.7

标签: python

解决方案


尝试

def check_file(*args, **kwargs):
    def decorator(f):
        def wrapper():
            file_path = os.path.join(kwargs['path'], kwargs['file_name'])
            if os.path.exists(file_path):
                print("{} Exist".format(kwargs['file_name'])
            else:
                print("{} Not Exist".format(kwargs['file_name'])
            f()
        return wrapper
    return decorator

当您使用带参数的装饰器时,您必须将装饰器函数包装在除这些参数之外的另一个函数周围。


推荐阅读