如何全局覆盖/重载Python函数(os.path.walk)?
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 页面)