将生成器/模拟函数传递给旧版模块中的方法

时间:2018-11-15 20:41:49

标签: python generator python-2.x legacy-code

在Python中,我有一个具有Utils方法的旧版模块legacy,如下所示:

@staticmethod
def legacy(users, some_data, other_data):
    j=0
    for _ in users.keys():
        do_something([{'a': some_data[j], 'b': other_data[j]}])
        j=j+1

我正在写一个新逻辑,其中仅userssome_data存在,而other_data不存在。

我正在考虑传递一种generator /模拟方法,以便我可以这样做:

Utils.legacy(users, some_data, magic)

在给定特定的{'b': magic[j]}的情况下设置j

有没有一种方法可以使用generator / mocking实现magic

注意:

  • 传统代码无法更改
  • 可以通过传递dict个用户规模来解决上述简化的问题,但我正在寻找更通用的解决方案。

1 个答案:

答案 0 :(得分:1)

您只需要一个带有__getitem__方法的类,该方法不会对其参数施加任何约束。

class Foo(object):
    def __getitem__(self, key):
        pass


Utils.legacy(users, some_data, Foo())

passreturn foo替换为您想要的占位符元素foo

或者,再三考虑,使用collections.defaultdict

from collections import defaultdict

Utils.legacy(users, some_data, defaultdict(lambda: None))

(或使用任何其他零参数函数来提供默认值来代替lambda: None。)