Dynamiczne wiązanie metod Pythona z instancją poprawnie wiąże nazwy metod, ale nie metodę

Piszę klienta dla grupy usług RESTful. Treść wywołań REST ma taką samą strukturę XML, podane parametry. Istnieje kilkadziesiąt połączeń i nie będę ich realizować. W związku z tym chcę, aby były łatwe do określenia i łatwe w użyciu. Metody REST są pogrupowane według funkcjonalności w oddzielnych modułach i będą musiały udostępniać ten sam otwieracz urllib2 dla uwierzytelniania i plików cookie. Oto przykład deklarowania metody:

@rest_method('POST', '/document')
def createDocument(id, title, body):
    # possibly some validation on the arguments
    pass

Deweloper musi tylko dbać o walidację. Format XML (dla POST i PUT) lub URL (dla GET i DELETE) oraz deserializacja odpowiedzi odbywa się w metodach pomocniczych. Zdobione metody są gromadzone w obiekcie klienta, z którego będą wykonywane i przetwarzane. Na przykład:

c = RESTClient('http://foo.com', username, password)
c.createDocument(1, 'title', 'body')

Kod został ukończony. Jedynym problemem jest dołączenie zdobionych metod do klasy klienta. Chociaż wszystkie dekorowane metody można zobaczyć w instancji klienta, wszystkie mają tę samą definicję, a mianowicie ostatnią, która ma być powiązana. Oto krótki przykład, który powiela zachowanie, które widzę:

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)

Po uruchomieniu otrzymuję następujące dane wyjściowe:

<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)

Nie jestem pewien, dlaczego obie metody są powiązane w ten sam sposób. Nie udało mi się znaleźć zbyt wielu dokumentów dotyczących sposobu, w jaki metoda wiąże metody z instancjami. Co się dzieje pod maską i jak mógłbym naprawić powyższy kod, aby drugie połączenie drukowało „(1)”?

questionAnswers(2)

yourAnswerToTheQuestion