[PyQt] Re: Monkey-patcing virtual methods with functions: change in behaviour

Phil Thompson phil at riverbankcomputing.com
Fri Oct 30 18:04:44 GMT 2009


On Fri, 30 Oct 2009 17:11:28 +0000, Phil Thompson
<phil at riverbankcomputing.com> wrote:
> On Fri, 30 Oct 2009 16:43:16 +0000, Phil Thompson
> <phil at riverbankcomputing.co.uk> wrote:
>> On Thu, 29 Oct 2009 18:07:33 +0100, Giovanni Bajo <rasky at develer.com>
>> wrote:
>>> Hi Phil,
>>> 
>>> it looks like SIP 4.9 changed behaviour wrt monkey-patching of virtual
>>> methods. If you use a regular Python function (or a lambda) to do the
>>> monkey patching, the function is passed 'self' when it's invoked.
>>> 
>>> This change in behaviour is undocumented among the incompatibilities
>>> with earlier versions. Moreover, it break existing code in a way that
it
>>> is hard to fix (there is no easy way to grep all occurrences); it is
>>> also hard to debug because the resulting exception (eg: "function takes
>>> no argument (1 given)") does not usually have any traceback attached.
>>> Lastly, it does not match what Python itself does when monkey-patching
a
>>> method with a function; with regular Python objects, the function is
not
>>> passed 'self' when it's invoked as a method.
>>> 
>>> What's your position on this? Was this change in behaviour a rationale
>>> choice or just an unwanted regression?
>> 
>> It should behave in the same way as regular Python classes do - which it
>> does (both for Python v2 and v3) in my tests.
>> 
>> Can you provide me with a test which shows different behavior?
> 
> Ahh - hang on, just realised my test is broken...

Fixed in tonight's SIP snapshot. It was fine when patching classes but
behaved differently to Python when patching instances.

Phil


More information about the PyQt mailing list