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

时间:2014-03-13 17:35:59

标签: python

scandir.walk() is a better alternative to os.walk()

我想用scandir.walk()替换os.walk()的所有实例。但是,我还想确保所有未来的开发人员都使用scandir.walk()。

这很难强制执行,所以我想知道是否可以覆盖默认的os.walk()功能。

2 个答案:

答案 0 :(得分:3)

Python 3.5 +

os.walk现在是scandir.walk。引用PEP 471

  

作为此提案的一部分, os.walk()也将被修改为使用 scandir()而不是 listdir() os.path.isdir()的。

  

现在使用 os.scandir()实现,将速度提高3-5   POSIX系统上的时间和Windows系统上的7-20倍。   [...]此提案的实施由Ben Hoyt(最初的>版本)和Tim Golden(他们使用C扩展>模块帮助很多)编写。它位于benhoyt/scandir的GitHub上。

较旧的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()的API与 os.walk()

完全相同

(来自GitHub page

答案 1 :(得分: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模块就是你想要的。希望这有帮助