在python中我想创建一个带有多个点的(类)方法,以便对xmlrpc
方法进行测试,这些方法可以有多个点的方法名称。当我尝试以下内容时:
class Foo(object):
def method.with.many.dots(self):
return 42
我的语法无效。我还试图使用更复杂的想法,如
class Foo(object):
def __getattr__(self, attr):
print attr
对于带点的方法名称,它也没有开箱即用的功能。任何想法我如何创建一个简单的模拟对象,我可以用它来做像
mock.some.test.with.many.dots()
在python代码中以一种简单的方式,无需启动xmlrpc
服务器?
答案 0 :(得分:8)
class Foo(object):
def __init__(self):
self._attr_path = []
def __getattr__(self, attr):
self._attr_path.append(attr)
return self
def __call__(self, *args, **kw):
print ".".join(self._attr_path)
print args, kw
del self._attr_path[:]
f = Foo()
f.a.b.c(1,2,3)
此输出:
a.b.c
(1, 2, 3) {}
修复@Daira Hopwood的问题:
class Bar(object):
def __init__(self, foo, attr):
self.foo = foo
self._attr_path = [attr]
def __getattr__(self, attr):
self._attr_path.append(attr)
return self
def __call__(self, *args, **kw):
print self
print args, kw
def __str__(self):
return ".".join(self._attr_path)
class Foo(object):
def __getattr__(self, attr):
return Bar(self, attr)
f = Foo()
f.a.b.c(1,2,3)
再次修复@Daira Hopwood的问题:
class Foo(object):
def __init__(self, parent=None, name=""):
self.parent = parent
self.name = name
def __getattr__(self, attr):
return Foo(parent=self, name=attr)
def __call__(self, *args, **kw):
print self
print args, kw
def __str__(self):
nodes = []
node = self
while node.parent:
nodes.append(node)
node = node.parent
return ".".join(node.name for node in nodes[::-1])
f = Foo()
x = f.a.b
y = f.a.c
x()
y()
g = f.a
f.b
g.b.c()
答案 1 :(得分:1)
此解决方案将起作用
输入:
import mock
MO = mock.Mock()
MO.some.test.wyth.many.dots.return_value = 42
MO.some.test.wyth.many.dots()
输出:
42
注意,“with”是关键字。
每个点缀的“后代”都是一个独立的(模拟)对象。