On Fri, Dec 22, 2017 at 11:11 PM Daniel Shahaf <d...@daniel.shahaf.name>
wrote:

> troycurti...@apache.org wrote on Sat, 23 Dec 2017 04:43 +0000:
> > Author: troycurtisjr
> > Date: Sat Dec 23 04:43:26 2017
> > New Revision: 1819110
> >
> > URL: http://svn.apache.org/viewvc?rev=1819110&view=rev
> > Log:
> > On branch swig-py3: Replace hasattr check for a method with try-except.
> >
> > * subversion/bindings/swig/include/proxy.swg
> >   (_assert_valid_deep): Replace hasattr check for the 'assert_valid'
> method
> >    with a try-except block as some class instances can have the method
> but return
> >    False to hasattr().
>
> I'm not too familiar with this code; shouldn't we be fixing the original
> problem, of hasattr() wrongly returning False?  I assume it predates the
> branch, though?
>
>
I won't lie, I didn't like this change much, since I didn't feel that I
understood exactly *why* it didn't work.  I only found info stating that
hasattr effectively did a getattr, but translated the AttributeError into a
boolean.  However, obviously *something* else is different.  The attribute
is obviously able to be found in some scenarios, but returns false for
hasattr.  So far my attempts to reproduce in a small test class haven't
been successful.  Perhaps, I should continue to dig into this one to get to
the bottom of what the difference actually is.


> While reviewing this I also noticed that svn_swig_py_convert_ptr() also
> does this hasattr() check — not sure whether it needs to change too? —
> and also has an "x | 0" construct, which seems suspicious (isn't it a
> no-op?).
>
>
I looked back through the logs in an attempt figure out the rationale for
the "x | 0" construct, but it just shows up that way when it was first
added [0].  I agree, it should just be changed to the define. I can't come
up with a reason to 'or' with 0.


> > Modified:
> >
>  subversion/branches/swig-py3/subversion/bindings/swig/include/proxy.swg
> >
> > Modified: subversion/branches/swig-py3/subversion/bindings/swig/include/
> > proxy.swg
> > URL:
> >
> http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/include/proxy.swg?rev=1819110&r1=1819109&r2=1819110&view=diff
> >
> ==============================================================================
> > --- subversion/branches/swig-py3/subversion/bindings/swig/include/
> > proxy.swg (original)
> > +++ subversion/branches/swig-py3/subversion/bindings/swig/include/
> > proxy.swg Sat Dec 23 04:43:26 2017
> > @@ -57,8 +57,11 @@
> >          _assert_valid_deep(v)
> >      # Ensure that the passed in value isn't a type, which could have an
> >      # assert_valid attribute, but it can not be called without an
> > instance.
> > -    elif type(value) != type and hasattr(value, "assert_valid"):
> > +    elif type(value) != type:
> > +      try:
> >          value.assert_valid()
> > +      except AttributeError:
> > +        pass
>
> Hmm.  Strictly speaking, the equivalent form would be:
>
> try:
>   value.assert_valid
> except AttributeError:
>   pass
> else:
>   value.assert_valid()
>
> since we don't want to mask any AttributeErrors inside assert_valid().
> I'm not sure how careful we are about this distinction, though.
>
>
Good catch!


> >  %}
> >
> >  /* Default code for all wrapped proxy classes in Python.
> >
> >
>
> Cheers,
>
> Daniel
>

0:  svn diff -r855533:855534
^/subversion/branches/python-bindings-improvements/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c@855534

Reply via email to