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

Yuya Nishihara yuya at tcha.org
Fri Nov 11 07:54:04 EST 2016


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 noop.

> 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.


More information about the Mercurial-devel mailing list