On Sun, 07 Apr 2013 10:52:11 +0000, Steven D'Aprano wrote: > 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.
Sorry, the first excerpt was to too short. As noted in the reply to Arnaud, a better excerpt is: class Foo : .... def to_binary(self, *varargs, **keys): .... code= ... args= ... # Add function header code = 'def to_binary(self, %s):\n' % ', '.join(args) + code exec(code) self.to_binary = new.instancemethod(to_binary, self, self.__class__) return self.to_binary(*varargs, **keys) If you'd like to see the full code (not by me) please see the Python package http://python-xlib.sourceforge.net/ file Xlib/protocol/rq.py method to_binary in class Struct > > 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? Yes, -- http://mail.python.org/mailman/listinfo/python-list