On 2 July 2016 at 14:54, Mike Bayer <[email protected]> wrote:
>
>
> On 07/02/2016 07:46 AM, Jonathan Underwood wrote:
>>
>> Hi,
>>
>> As documented, the default constructor for objects that inherit from
>> Base doesn't work in multiple inheritance situations (unless Base is
>> last in the list of classes, I suppose). It wouldn't be too difficult to
>> change this without breaking existing expectations, I believe. Something
>> like this:
>>
>> def _declarative_constructor(self, **kwargs):
>>     """A simple constructor that allows initialization from kwargs.  Sets
>>     attributes on the constructed instance using the names and values
>>     in ``kwargs``.
>>
>>     Differs from the default constructor in that (a) keys not present
>>     in the attributes of the instance's class are ignored; (b) we call
>>     super at the end to ensure proper multiple inheritance behaviour.
>>
>>     """
>>     cls_ = type(self)
>>     unused_kwargs = dict()
>>     for k in kwargs:
>>         if hasattr(cls_, k):
>>             setattr(self, k, kwargs[k])
>>         else:
>>             unused_kwargs.update({k:kwargs[k]})
>>
>>     super(Base, self).__init__(**unused_kwargs)
>
>
> Well, all existing tests would have to pass, but also I wonder where are you
> getting "Base" above?  It's not present and would have to be passed to an
> enclosing function that generates a _declarative_constructor as a closure.
> That would imply a change in the API of the declarative_base function, which
> accepts a constructor function as an argument, to now accept a
> constructor-generating function.

Yes, I had this thought too, after sending the earlier email. Having
thought about it, I can't immediately see an easy way to establish the
name of the generated declarative_base class without the API change
you describe (which I assume you'd be opposed to). This is a shame, as
it would be nice not to break multiple inheritance, but I really can't
see a good general fix.

Cheers,
Jonathan.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to