Maric Michaud wrote: > Le Jeudi 08 Juin 2006 14:28, Ilias Lazaridis a écrit : >> Another possibility is to enlink (hook?) the functionality into an >> existent function >> >> Is there any way (beside a patch) to alter the behaviour to an existing >> function. Is ther a python construct similar to the "alias_method" of Ruby: >> > No, there is no special construct to do this, but we do things very similar > every day in Zope, it's called "monkey patch" : > > #patch_service.py > from toto import service > > def my_impl(self, *args) : > old_result = self._old_method(*args) > # ... > return new_result > > if not hasattr(service, '_old_method') : > service._old_method = service.method > service.method = my_impl > > once this file is imported, all future calls to "method" of service instances > will use my_impl.
Ok, just a small problem when a _function_ is to be hooked. Looking a the code in the debugger shows that the function "syncdb" is correctly overridden. But when the code returns, "syncdb" has again it's original value. Can I import "syncdb" by reference instead by value, thus the change 'survives'? #------------------------------------------------------------------------------ #syncdb_hook.py from django.rework.evolve import evolvedb from django.core.management import syncdb def syncdb_new(*args) : evolvedb() syncdb_result = syncdb_old(*args) return syncdb_result if syncdb != syncdb_new: syncdb_old = syncdb syncdb = syncdb_new . -- http://lazaridis.com -- http://mail.python.org/mailman/listinfo/python-list