gpt4 book ai didi

python - Luigi 参数默认值和模拟

转载 作者:太空狗 更新时间:2023-10-30 01:33:38 27 4
gpt4 key购买 nike

我正在尝试模拟为 luigi 参数提供默认值的东西。

一个愚蠢的例子展示了我想要完成的事情:

待测任务:

import luigi
from bar import Bar

bar = Bar()

class Baz(luigi.Task):

qux = luigi.Parameter(default=bar.bar())

def baz(self):
return self.qux;

def foo(self):
return bar.bar()

单元测试代码:

import unittest
from mock import Mock, patch
from sut.baz import Baz

class TestMocking(unittest.TestCase):

def test_baz_bar(self):
self.assertEquals("bar", Baz().baz())

@patch('sut.baz.bar')
def test_patched_baz(self, mock_bar):
mock_bar.bar = Mock(return_value="foo")
self.assertEquals("foo", (Baz().baz()))

@patch('sut.baz.bar')
def test_patched_foo(self, mock_bar):
mock_bar.bar = Mock(return_value="foo")
self.assertEquals("foo", (Baz().foo()))

看起来 luigi.Parameter 逻辑发生在补丁之前。

在此示例中,test_patched_foo 通过,而 test_patched_baz 失败。所以补丁确实发生了,但是发生在 luigi.Parameter(default=bar.bar()) 行调用之后。

是否可以模拟和修补以这种方式调用的东西?

最佳答案

尝试将 qux = luigi.Parameter(default=bar.bar()) 行移动到 Baz 类的 __init__ 方法中.由于它在 __init__ 之外,它是在类定义时设置的,而不是在实例创建时设置的,但是将它放入 __init__ 中会将其创建延迟到 Baz 实例已创建。不要忘记在 super 类上调用 __init__:

class Baz(luigi.Task):

def __init__(self, *args, **kwargs):
super(Baz, self).__init__(*args, **kwargs)

self.qux = luigi.Parameter(default=bar.bar())

...

关于python - Luigi 参数默认值和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31008035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com