[PATCH 1 of 4 py3] error: wrap super() init call in try/except
Martijn Pieters
mj at zopatista.com
Fri Nov 11 13:29:31 UTC 2016
> On 11 Nov 2016, at 12:54, Yuya Nishihara <yuya at tcha.org> wrote:
>
> On Thu, 10 Nov 2016 17:01:22 +0000, Martijn Pieters wrote:
>>> 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).
>
> I mean this try-except hides the real bug caused by kw[b'hint'] != kw[u'hint']
> on Python 3. kw.pop('hint') is loop.
Ah! Yes, good catch again.
>> 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.
>
> In which case, I think the previous class of Hint must consume *args and **kw.
Probably, yes, still having a non-empty args / kw dataset by the time you reach `object` could be a bug.
But might there be a situation where extensions may have to deal with *potential* mixins? There are scenarios possible where one extension can't know what other extensions are installed and must always assume that certain arguments are needed.
I'm not familiar enough with where `Hint` is used, and it is probably better to only plug in a `try:...except:` at the end when the situation actually arises.
Martijn
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161111/b519d5fb/attachment-0002.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://lists.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161111/b519d5fb/attachment.asc>
More information about the Mercurial-devel
mailing list