[PATCH 1 of 4 py3] error: wrap super() init call in try/except

Martijn Pieters mj at zopatista.com
Thu Nov 10 12:01:22 EST 2016


> On 10 Nov 2016, at 13:09, Yuya Nishihara <yuya at tcha.org> wrote:
> 
> On Wed, 09 Nov 2016 11:23:38 -0500, Augie Fackler wrote:
>> # HG changeset patch
>> # User Augie Fackler <augie at google.com>
>> # Date 1476019730 14400
>> #      Sun Oct 09 09:28:50 2016 -0400
>> # Node ID 6f2a1367baa59f33fcbc328aea1a637658ce345e
>> # Parent  c9313a5b8e602b6b3b9a4427e5c2f452a711dd73
>> error: wrap super() init call in try/except
>> 
>> This is how we have to handle object's pickiness while still correctly
>> handling multiple inheritance MRO nonsense.
>> 
>> diff --git a/mercurial/error.py b/mercurial/error.py
>> --- a/mercurial/error.py
>> +++ b/mercurial/error.py
>> @@ -23,7 +23,10 @@ class Hint(object):
>>     """
>>     def __init__(self, *args, **kw):
>>         self.hint = kw.pop('hint', None)
>> -        super(Hint, self).__init__(*args, **kw)
>> +        try:
>> +            super(Hint, self).__init__(*args, **kw)
>> +        except TypeError:
>> +            pass
> 
> I don't fully understand the MRO, but I believe what we need is u'hint'.

No, Hint is not a string. It is a direct reference to the class object in which this method is defined (it is looked up as a global each time __init__ is run).

super(Hint, self).__init__ will find the *next class* after Hint in the MRO for type(self). Depending on how Hint was used as a base class in *another class*, the next class in the MRO for self may or may not be object. Since object.__init__() doesn't take any arguments (not even *args or **kwargs), if either args or kw is non-empty you'd get a TypeError here.

Because you can't know for certain that the next class in the MRO is *not* object, it is prudent to use a try...except TypeError: pass here.

> --- a/mercurial/error.py
> +++ b/mercurial/error.py
> @@ -22,7 +22,7 @@ class Hint(object):
>     pass remaining arguments to the exception class.
>     """
>     def __init__(self, *args, **kw):
> -        self.hint = kw.pop('hint', None)
> +        self.hint = kw.pop(u'hint', None)
>         super(Hint, self).__init__(*args, **kw)
> 
> class RevlogError(Hint, Exception):

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161110/9aa5dc9d/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 204 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161110/9aa5dc9d/attachment.sig>


More information about the Mercurial-devel mailing list