Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用异步/等待的递归_Python_Recursion_Async Await - Fatal编程技术网

Python:使用异步/等待的递归

Python:使用异步/等待的递归,python,recursion,async-await,Python,Recursion,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] != ".":

这是一些用于遍历文件树的简单工作代码。它采用了同步发电机的概念:

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
(python3.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

/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
在某种程度上,这是有道理的,但我不知道我应该做的最后一步是什么。

建议了解决方案。多亏了


测试脚本会很困难,因为它不是一个最小的可执行示例。但是无论如何,如果您将异步上下文中的
yield-traverse\u-target\u-tree\u-async(d)
更改为
yield-from-traverse\u-target\u-tree\u-async(d)
yield-from
是一个语法错误,这是正确的。啊,我甚至不知道。。。使用
async for
手动扩展它怎么样?这个答案应该是有帮助的:旁注:
os.listdir
os.scandir
差得多,特别是当你想测试它是否是一个目录时(由
scandir
返回的
DirEntry
可以免费告诉你,而你目前的方法要求每个文件都有一个
stat
)。
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:
        async for f in traverse_target_tree_async(d):
            yield f

    for f in files:
        yield f