python - Python:使用 async/await 进行递归
问题描述
这是一些用于遍历文件树的简单工作代码。它使用了同步生成器的思想:
def list_dir_groom(abs_path):
"""Returns the list of directories
and the list of files ([abs_path] offspring).
"""
dirs, files = [], []
for i in os.listdir(abs_path):
if i[0] != ".":
x = abs_path.joinpath(i)
if x.is_dir():
dirs.append(x)
else:
if is_target_file(x):
files.append(x)
return dirs, files
def traverse_target_tree(tgt_dir):
"""Recursively traverses the target directory [tgt_dir]
and yields a sequence of file names.
"""
dirs, files = list_dir_groom(tgt_dir)
for d in dirs:
yield from traverse_target_tree(d)
for f in files:
yield f
def tweak():
"""Tweak all files.
"""
for i in traverse_target_tree(ARGS.tgt_dir):
print(f"{i}")
出于教育目的,我一直在尝试使用asyncio
(Python 3.8.1)重写它。当然,这不能正常工作:
async def traverse_target_tree_async(tgt_dir):
"""Recursively traverses the target directory [tgt_dir]
and yields a sequence of file names.
"""
dirs, files = list_dir_groom(tgt_dir)
for d in dirs:
yield traverse_target_tree_async(d)
for f in files:
yield f
async def tweak_async():
"""Tweak all files.
"""
async for i in traverse_target_tree_async(ARGS.tgt_dir):
print(f"{i}")
...
asyncio.run(tweak_async())
示例输出如下所示:
<async_generator object traverse_target_tree_async at 0x7f4993429ca0>
<async_generator object traverse_target_tree_async at 0x7f4993429d30>
<async_generator object traverse_target_tree_async at 0x7f4993429ca0>
<async_generator object traverse_target_tree_async at 0x7f4993429d30>
/home/user/spaces/python/tex-tweak/n.vim
/home/user/spaces/python/tex-tweak/README.md
/home/user/spaces/python/tex-tweak/pyproject.toml
/home/user/spaces/python/tex-tweak/poetry.lock
在某种程度上,这是有道理的,但我不知道我应该做的最后一步。
解决方案
推荐阅读
- bash - crontab 看不到 shell 命令的 $1 参数
- android - 在 Google Play 上发布了带有调试密钥库的 APK
- android - 如何知道按钮状态是否已从启用更改为禁用 android?
- sql - 如果有记录不会使用该特定列,我应该将列设置为 NULL 吗?
- linux - Linux下只有中断向量能识别中断源吗?
- c# - System.UnauthorizedAccessException:似乎无法确定
- mailgun - 递送问题 - Hotmail 和 Yahoo
- php - JSPDF + HTML2CANVAS + Wordpress + 试图将 PDF 保存到服务器上的文件夹。
- c# - RadGrid 在编辑模式下使用 RadComboBox 按需加载
- c++ - 如何在 std::string 和 Aws::String 之间进行转换?