我可以在不创建另一个包装函数的情况下从内部对生成器函数进行排序,或者在外部对其进行排序吗?

问题描述

我有一个很好的 os.walk() 包装器,可以将深入发现的文件和目录映射到 Path 的子类:

类查找:

@staticmethod
def deep(path: Union[str,Path,'WalkPath'],sort_key=lambda p: str(p).lower()) -> ['WalkPath']:
    
    if Path(path).is_file(): 
        return [WalkPath(path)]
    
    for root,dirs,files in os.walk(WalkPath(path)):
        
        dirs = sorted([WalkPath(root).joinpath(d) for d in dirs],key=sort_key)
        files = sorted([WalkPath(root).joinpath(f) for f in files],key=sort_key)
        
        yield WalkPath(root,dirs=dirs,files=files)
        yield from files

这很有效 - 我可以对结果进行迭代,并对其中任何一个结果进行检查,检查其中包含的文件或目录。

不幸的是,返回的结果相当未排序。我知道我可以做到这一点:

paths = sorted(Find.deep(root),key=lambda p: str(p).lower())

事后,或者我可以创建一个包装函数:

@staticmethod      
def sorted_deep(path):
    yield from sorted(Find.deep(root),key=lambda p: str(p).lower())

但我想知道是否有办法直接在主函数中处理排序?我尝试研究是否可以重新处理它以适合 lambda 表达式,但无法使其与分配目录和文件一起工作。

为了完整起见,这里是 WalkPath 对象:

#!/usr/bin/env python
import os
import pathlib
from pathlib import Path
from typing import Union

class WalkPath(Path):
    
    _flavour = type(Path())._flavour
    
    def __init__(self,*args,dirs: []=[],files: []=[]):
        """Initialize WalkPath object.

        Args:
            dirs (list):    Dirs provided by os.walk(),defauls to []
            files (list):   Files provided by os.walk(),defaults to []
        """
        
        super().__init__()
        
        self.dirs: [WalkPath] = list(map(WalkPath,dirs))
        self.files: [WalkPath] = list(map(WalkPath,files))
    
    def joinpath(self,path) -> 'WalkPath':
        joined = WalkPath(super().joinpath(path))
        self.__dict__ = joined.__dict__.copy()
        return joined
    
    @property
    def is_terminus(self) -> bool:
        return self.is_file() or not self.dirs
    
    @property
    def dirs_abs(self) -> ['WalkPath']:
        return [self.joinpath(d) for d in self.dirs]
    
    @property
    def files_abs(self) -> ['WalkPath']:
        return [self.joinpath(f) for f in self.files]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)