我正在为一组RESTful服务编写客户端。给定参数,REST调用的主体具有相同的XML结构。有几十个电话,我不会执行所有的电话。因此,我想让他们易于指定和易于使用。 REST方法按功能分组到不同的模块中,并且需要共享相同的urllib2开启器来进行认证和cookie。下面是如何声明一种方法的示例:将Python方法动态绑定到实例正确绑定方法名称,但不是方法
@rest_method('POST', '/document')
def createDocument(id, title, body):
# possibly some validation on the arguments
pass
所有开发人员必须关心的是验证。 XML(用于POST和PUT)或URL(用于GET和DELETE)以及响应的反序列化的格式在辅助方法中完成。装饰好的方法被收集在一个客户端对象中,从中执行和处理它们。例如:
c = RESTClient('http://foo.com', username, password)
c.createDocument(1, 'title', 'body')
代码完成。唯一的问题是将装饰的方法附加到客户端类。尽管可以在客户端实例中看到所有装饰的方法,但它们都共享相同的定义,即最后一个要绑定的定义。下面是其复制我看到的行为一个简单的例子:
import types
class C(object): pass
def one(a): return a
def two(a, b): return a+b
def bracketit(t): return '(%s)' % t
c = C()
for m in (one, two):
new_method = lambda self, *args, **kwargs:\
bracketit(m(*args, **kwargs))
method = types.MethodType(new_method, c, C)
setattr(C, m.__name__, method)
print c.one
print c.two
print c.two(1, 2)
print c.one(1)
当我运行它,我得到以下的输出:
<bound method C.<lambda> of <__main__.C object at 0x1003b0d90>>
<bound method C.<lambda> of <__main__.C object at 0x1003b0d90>>
(3)
Traceback (most recent call last):
File "/tmp/test.py", line 19, in <module>
print c.one(1)
File "/tmp/test.py", line 12, in <lambda>
bracketit(m(*args, **kwargs))
TypeError: two() takes exactly 2 arguments (1 given)
我不知道为什么这两种方法的结合一样的方法。我一直无法找到关于instancemethod如何将方法绑定到实例的很多文档。发生了什么事情,以及如何修复上述代码,以便第二次调用打印“(1)”?
卫生署。当然。谢谢。 –