python - 如何使用堆叠在 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
解决方案
尝试
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
当您使用带参数的装饰器时,您必须将装饰器函数包装在除这些参数之外的另一个函数周围。
推荐阅读
- javascript - getByteFrequencyData 获取给定时间的准确数据
- flutter - 在 Dart 中访问 Firestore 数组
- android - 如何将 Koin ViewModel 注入移动到 Base 片段?
- java - 如何从android文件中获取真实的文件路径
- symfony - 在 makefile 命令上添加控制器名称
- javascript - Audiocontext Web Audio API createMediaStreamDestination().stream 没有音频
- python - Numpy - 根据函数选择索引
- apache-spark - 在 pyspark 上加入两次计算,也许我不明白懒惰?
- stream - 没有人在语音频道时停止直播,当有人加入 discord.js 时播放
- python - 转置熊猫数据框并垂直附加