首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >patch_default_args是真,但PyFakeFS不修补pathlib.Path.cwd()

patch_default_args是真,但PyFakeFS不修补pathlib.Path.cwd()
EN

Stack Overflow用户
提问于 2022-08-13 08:07:52
回答 1查看 43关注 0票数 0

我在函数签名中使用pathlib.Path.cwd()作为默认参数。

代码语言:javascript
复制
def foobar(dir_arg=pathlib.Path.cwd() / 'logs'):
    # ...

当我用pyfakefs对这个函数进行单元测试时,参数没有得到修补。但是patch_default_args设置为True

这是MWE。

代码语言:javascript
复制
#!/usr/bin/env python3
import pyfakefs.fake_filesystem_unittest as pyfakefs_ut
import pathlib


class Logging(pyfakefs_ut.TestCase):

    def setUp(self):
        print('PyFakeFS activated')
        self.setUpPyfakefs(
            allow_root_user=False,
            patch_default_args=True)

    def test_foobar(self):
        foobar()


def foobar(dir_arg=pathlib.Path.cwd() / 'logs'):
    dir_local = pathlib.Path.cwd() / 'logs'

    print(f'dir_arg: {dir_arg}')
    print(f'dir_local: {dir_local}')


if __name__ == '__main__':
    print('Without PyFakeFS')
    foobar()

将其作为测试运行(使用激活的pyfakefs):

代码语言:javascript
复制
python3 -m unittest x.py
PyFakeFS activated
dir_arg: /home/user/tab-cloud/_transfer/logs
dir_local: /logs
.
----------------------------------------------------------------------
Ran 1 test in 0.744s

OK

在不使用pyfakefs的情况下运行此常规程序

代码语言:javascript
复制
./x.py
Without PyFakeFS
dir_arg: /home/user/tab-cloud/_transfer/logs
dir_local: /home/user/tab-cloud/_transfer/logs

作为测试运行时的预期输出将是

代码语言:javascript
复制
PyFakeFS activated
dir_arg: /logs
dir_local: /logs

还有一个关于这个问题的公开发行。但是现在我认为这不是一个bug,而是显示器面前的一个问题。

EN

回答 1

Stack Overflow用户

发布于 2022-08-13 19:14:26

我的答案是基于PyFakeFS的维护者的反馈

这个问题符合patch_default_args参数不考虑的边缘情况。它修补文件系统功能,但不修复类(如我的例子)。

解决方案之一是使用modules_to_reload参数。

为了用代码演示解决方案,我将MWE从问题中分离成两个文件。

这是x.py

代码语言:javascript
复制
#!/usr/bin/env python3
import pathlib


def foobar(dir_arg=pathlib.Path.cwd() / 'logs'):
    dir_local = pathlib.Path.cwd() / 'logs'

    print(f'dir_arg: {dir_arg}')
    print(f'dir_local: {dir_local}')


if __name__ == '__main__':
    print('Without PyFakeFS')
    foobar()

我是test_x.py

代码语言:javascript
复制
#!/usr/bin/env python3
import pyfakefs.fake_filesystem_unittest as pyfakefs_ut
import pathlib
import x

class Logging(pyfakefs_ut.TestCase):

    def setUp(self):
        print('PyFakeFS activated')
        self.setUpPyfakefs(
            allow_root_user=False,
            modules_to_reload=[x])

    def test_foobar(self):
        x.foobar()

重装顺序

在使用modules_to_reload时,加载顺序在某些边缘情况下也很重要。一个示例和一个解决方案可以找到这里

关于这里的MWE。当foobar()位于导入到x/__init__.py中的子模块(sub_x.py)中时,应该首先加载子模块。

代码语言:javascript
复制
modules_to_reload=[x.sub_x, x]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73342581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档