On Sun, 07 Apr 2013 09:50:35 +0000, Helmut Jarausch wrote: > Hi, > > I'm trying to port a class to Python3.3 which contains > > class Foo : > .... > def to_binary(self, *varargs, **keys): > .... > .... > self.to_binary = new.instancemethod(to_binary, self, self.__class__) > # Finally call it manually > return apply(self.to_binary, varargs, keys)
I do not understand this code. Can you give a short example that actually works please? As written, your code has a class that defines a to_binary method. Then, *outside* of the method, in the class definition, you refer to "self", and use a return statement. This is not possible -- self does not exist, and return gives a SyntaxError. But, if the indentation is wrong, it looks like you are trying to get the to_binary method to replace itself with a global to_binary function. I do not understand this. > ---- > > The last line has been transformed to > return self.to_binary(*varargs, **keys) > > by 2to3 > > But how to transform the line with new.instancemethod. I've seen > examples where > new.instancemethod(to_binary, ....) > is replaced by to_binay > but this doesn't work here since to_binary isn't known. I cannot answer your question, because I don't understand it. But perhaps this will help: # === Python 2 version === class Spam: pass x = Spam() def method(self, arg): return {arg: self} import new x.method = new.instancemethod(method, x, x.__class__) x.method("hello") => returns {'hello': <__main__.Spam instance at 0xa18bb4c>} Here is the Python 3 version: # === Python 3 === class Spam: pass x = Spam() def method(self, arg): return {arg: self} import types x.method = types.MethodType(method, x) x.method("hello") => returns {'hello': <__main__.Spam object at 0xb7bc59ac>} Does this help? -- Steven -- http://mail.python.org/mailman/listinfo/python-list