如何在python中获取指针类型行为

时间:2010-08-26 13:42:07

标签: python monkeypatching

我想编写一个测试用例列表的测试用例。 这是我想要做的一个例子:

from mock import Mock
def method1 ():
    pass

def method2 ():
    pass

## The testcase will then contain:
for func in method_list:
    func = Mock()
    # continue to setup the mock and do some testing

我想要达到的目的如下:
步骤1)将我的本地方法变量分配给method_list中的每个项目 步骤2)Monkeypatch方法。在这个例子中,我使用的是mock.Mock对象

实际发生的是:
步骤1)方法成功分配给method_list中的项目 - 确定
然后将步骤2)方法分配给对象Mock() - NOK

我在步骤2中想要的是从method_list中获取该项目,例如method1将分配给Mock()对象。最终结果是方法和方法1都指向相同的Mock()对象

我意识到我基本上在做的是 a = b
a = c
然后期待c == b!

我想这不可能以某种方式获得指向b的指针?

3 个答案:

答案 0 :(得分:1)

嗯,如何简单地修改method_list?

for i in range(len(method_list)): # xrange in Python 2
    method_list[i] = Mock()

你所描述的更接近于C ++引用而不是指针。很少有语言具有这样的语义(少数语言提供了一个特殊的关键字,用于传递引用),包括Python。

答案 1 :(得分:1)

如果我理解正确,您想要更改变量 method1指向的内容吗?是吗?

您可以通过修改本地变量字典中的条目来完成此操作:

for method_name in [ 'method1', 'method2' ]:
    locals()[ method_name ] = Mock( )

您之前的代码没有达到您想要的效果的原因是func是对函数method1的引用。通过分配给is,您只需更改它指向的内容。

您确定要这样做吗?

Monkeypatching是令人讨厌的,可能会导致许多问题。

答案 2 :(得分:1)

这样的东西?

from mock import Mock
def method1 ():
    pass

def method2 ():
    pass

method_list=list(f for f in globals() if hasattr(globals()[f],'__call__') and f.startswith('method'))
print method_list
## The testcase will then contain:
for func in method_list:
    globals()[func] = Mock(func)
    # continue to setup the mock and do some testing
但是,我不太确定这是明智之举。看起来与装饰器有关。