[SciPy-Dev] Proposal: calling signal.lti object returns transfer function value

Juan Luis Cano juanlu001 at gmail.com
Wed Jul 24 04:06:36 EDT 2013


On 07/23/2013 11:47 PM, Ralf Gommers wrote:
>
>
>
> On Tue, Jul 23, 2013 at 6:05 PM, Juan Luis Cano <juanlu001 at gmail.com 
> <mailto:juanlu001 at gmail.com>> wrote:
>
>     On 07/20/2013 05:54 PM, Ralf Gommers wrote:
>>
>>
>>
>>     On Tue, Jul 16, 2013 at 5:28 PM, Juan Luis Cano
>>     <juanlu001 at gmail.com <mailto:juanlu001 at gmail.com>> wrote:
>>
>>         BTW (and this is a side question), is there a reason the code of
>>         signal.lti is full of `self.__dict__['X'] = Y` instead of
>>         `self.X = Y`?
>>
>>
>>     It's very ugly but does have a function. Because of how
>>     ``__setattr__`` is implemented you cannot just set self.num &
>>     related attributes in ``__init__``. The alternative is to
>>     transform num/den/zeros/poles/.... into properties with setter
>>     methods that keep all properties in sync. A PR making that change
>>     would be welcome.
>
>     If I understood correctly, it would be something like this:
>
>     @property num(self):
>         """Numerator"""
>         return self._num
>
>     @num.setter num(self, value):
>         self._num = value
>         self.__dict__['zeros'], self.__dict__['poles'],
>     self.dict__['gain'] = tf2zpk(self.num, self.den)
>         self.__dict__['A'], self.__dict__['B'], self.dict__['C'],
>     self.dict__['D'] = tf2ss(self.num, self.den)
>
>     then you really cannot get rid of `self.__dict__['X']` because if
>     you use the `self.X` then the same circular problem would happen
>     with the setters of the other properties.
>
>
> The setter methods can use the private attributes to get around that, 
> for example num.setter updates self._den and not self.den.
>
>     And on the other hand, when instantiating the object not all the
>     properties are available (e.g.: you assign `num`, but cannot
>     update zeros, poles and gain because `den` is not yet assigned) so
>     a special case has to be included in the setter.
>
>
> Not really, for the same reason. Assign to self._num and self._den.

Thank you very much for your advice! I implemented these ideas in this 
pull request:

https://github.com/scipy/scipy/pull/2655

I hope we can follow the discussion there and improve the code.

Regards

Juan Luis Cano
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scipy-dev/attachments/20130724/3b7d490c/attachment.html>


More information about the SciPy-Dev mailing list