Das dynamische Binden von Python-Methoden an eine Instanz bindet die Methodennamen korrekt, nicht jedoch die Methode

Ich schreibe einen Kunden für eine Gruppe von RESTful-Services. Der Hauptteil der REST-Aufrufe hat bei gegebenen Parametern dieselbe XML-Struktur. Es gibt mehrere Dutzend Aufrufe, und ich werde nicht alle implementieren. Als solches möchte ich, dass sie einfach zu spezifizieren und einfach zu verwenden sind. Die REST-Methoden sind nach Funktionen in separaten Modulen zusammengefasst und müssen für Authentifizierung und Cookies denselben urllib2-Öffner verwenden. Hier ist ein Beispiel, wie eine Methode deklariert wird:

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

Der Entwickler muss sich nur um die Validierung kümmern. Das Format des XML (für POST und PUT) oder der URL (für GET und DELETE) und die Deserialisierung der Antwort erfolgt in Hilfsmethoden. Die dekorierten Methoden werden in einem Client-Objekt gesammelt, von dem aus sie ausgeführt und verarbeitet werden. Zum Beispiel:

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

Der Code ist fertig. Das einzige Problem besteht darin, die dekorierten Methoden an die Clientklasse anzuhängen. Obwohl alle dekorierten Methoden in der Client-Instanz angezeigt werden, haben sie alle dieselbe Definition, nämlich die letzte, die gebunden werden soll. Hier ist ein kurzes Beispiel, das das Verhalten, das ich sehe, dupliziert:

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)

Wenn ich dies ausführe, erhalte ich die folgende Ausgabe:

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

Ich bin nicht sicher, warum die beiden Methoden auf die gleiche Weise gebunden sind. Ich konnte nicht viel Dokumentation darüber finden, wie instancemethod Methoden an Instanzen bindet. Was ist unter der Motorhaube los und wie kann ich den obigen Code korrigieren, damit beim zweiten Aufruf "(1)" ausgegeben wird?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage