如何全局覆盖/重载Python函数(os.path.walk)?

2 投票
2 回答
770 浏览
提问于 2025-04-17 22:10

scandir.walk() 是 os.walk() 的更好选择

我想把代码里所有的 os.walk() 替换成 scandir.walk()。不过,我还希望以后所有的开发者都能使用 scandir.walk()。

这可能很难做到,所以我在想有没有办法覆盖默认的 os.walk() 功能。

2 个回答

0

如果你真的想要一个永久的解决方案,可能值得去修改你Python安装中的os.py文件。为了避免将来想要恢复时的麻烦,我建议在那个文件里做这样的修改:

def walk(top, topdown=True, onerror=None, followlinks=False):
    """walk function doc string"""


    import scandir
    return scandir.walk(top, topdown, onerror, followlinks)

我觉得这样做应该可以,但我不是很确定,而且我对搞坏我公司的Python安装有点担心,所以没敢去测试。所以你可能需要自己试试看,但我认为修改实际的os模块就是你想要的。希望这对你有帮助。

3

Python 3.5+

os.walk 现在变成了 scandir.walk。根据 PEP 471 的说明:

这个提案的一部分是,os.walk() 也会被修改为使用 scandir(),而不是 listdir()os.path.isdir()

现在它是

使用 os.scandir() 来实现的,这样在 POSIX 系统上速度提高了 3 到 5 倍,在 Windows 系统上速度提高了 7 到 20 倍。[...] 这个提案的实现是由 Ben Hoyt(最初版本)和 Tim Golden(在 C 扩展模块方面提供了很多帮助)共同完成的。它的代码可以在 GitHub 上找到,链接是 benhoyt/scandir

旧版 Python

只需简单修补一下:

>>> import scandir
>>> import os
>>> os.walk
<function walk at 0x7f3c02afc8c0>
>>> scandir.walk
<function walk at 0x7f3c00fe28c0>
>>> os.walk = scandir.walk
>>> os.walk is scandir.walk
True
>>> os.walk('/')
<generator object walk at 0x7f3c02b53500>

因为

scandir.walk() 的接口和 os.walk() 完全一样

(来自 GitHub 页面

撰写回答