patch_default_args为True时PyFakeFS未修补pathlib.Path.cwd()默认参数
问题原因与解决方法
问题根源
Python函数的默认参数是在函数定义阶段就完成计算并绑定的,并非调用时才求值。你写的dir_arg=pathlib.Path.cwd() / 'logs',这个默认值在pyfakefs启动补丁之前就已经被计算成真实系统的路径了,哪怕开启patch_default_args=True也无法修改这个已经提前绑定好的真实路径对象。
解决方案
把默认参数设为None,在函数内部延迟计算默认值,这样每次调用函数时,Path.cwd()都会在pyfakefs的补丁环境下执行,得到虚拟路径:
import pathlib def foobar(dir_arg=None): # 延迟计算默认路径,确保在函数调用时(补丁生效后)求值 if dir_arg is None: dir_arg = pathlib.Path.cwd() / 'logs' dir_local = pathlib.Path.cwd() / 'logs' # ... 后续业务逻辑
测试代码示例
from pyfakefs.fake_filesystem_unittest import TestCase class TestFoobar(TestCase): def test_default_path(self): self.setUpPyfakefs(patch_default_args=True) self.fs.create_dir('/logs') foobar() # 此时dir_arg和dir_local都会指向虚拟路径 /logs
这样修改后,默认参数的求值逻辑就会在pyfakefs的虚拟文件系统环境中执行,和函数内的dir_local保持一致,都使用虚拟路径。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

