[PyQt] dip model types, properties, and syntax

Phil Thompson phil at riverbankcomputing.com
Wed Aug 25 20:00:38 BST 2010


On Wed, 25 Aug 2010 14:27:55 -0400, Darren Dale <dsdale24 at gmail.com>
wrote:
> On Wed, Aug 25, 2010 at 1:17 PM, Phil Thompson
> <phil at riverbankcomputing.com> wrote:
>> On Sat, 14 Aug 2010 08:45:13 +0100, Phil Thompson
>> <phil at riverbankcomputing.com> wrote:
>>> On Mon, 9 Aug 2010 09:45:12 -0400, Darren Dale <dsdale24 at gmail.com>
>> wrote:
>>>> I have a question about using dip model attributes as properties. The
>>>> documentation at
>>>>
>>>
>>
http://www.riverbankcomputing.com/static/Docs/dip/model_tutorial.html#attributes-are-properties
>>>> gives an example:
>>>>
>>>> class ExampleModel(Model):
>>>>
>>>>     name = Str
>>>>
>>>>     def _get_name(self):
>>>>         return self._name
>>>>
>>>>     def _set_name(self, value):
>>>>         self._name = value
>>>>
>>>>     # method taken from previous section in documentation:
>>>>     def _default_name(self):
>>>>         import name_database
>>>>         return name_database.most_common_name()
>>>>
>>>>
>>>> Would it be possible for dip's model types to support the property
>>>> decorator syntax introduced in Python-2.6? If so, the above example
>>>> could then be implemented as:
>>>>
>>>> class ExampleModel(Model):
>>>>
>>>>     name = Str
>>>>
>>>>     @name.getter
>>>>     def name(self):
>>>>         return self._name
>>>>
>>>>     @name.setter
>>>>     def name(self, value):
>>>>         self._name = value
>>>>
>>>>     @name.default
>>>>     def name(self):
>>>>         import name_database
>>>>         return name_database.most_common_name()
>>>>
>>>> The virtue, aside from reusing an already familiar pattern in the
>>>> standard library, is that the ExampleModel namespace has fewer
exposed
>>>> private methods, which is desirable for models intended to be used
and
>>>> inspected in an interactive python environment like IPython.
>>>
>>> Hmm - interesting. It's more verbose but it is nicer. It could also
>>> support observers and allow declarative observers across classes. It
may
>>> also be faster.
>>
>> Unfortunately I can't think of a way to implement it. The problem
arises
>> because "name = Str" is allowed as a shortcut for "name = Str()" and
>> there
>> doesn't seem to be a way to implement (for example) getter() so that it
>> can
>> cope with the different cases.
> 
> Hmm. What if BaseType or ValueType did something like:
> 
>     @classmethod
>     def property(cls, val):
>         if type(val) == types.FunctionType:
>             return property_factory(cls, getter=val)
>         else:
>             res = property_factory(cls, default=val)
>             return res.getter
> 
> That may let you do:
> 
> class Test(model):
>     @Str.property
>     def name(self):
>         return self._name
> 
> or
> 
> class Test(model):
>     #provide the default:
>     @Str.property('foo')
>     def name(self):
>         return self._name
> 
> Is that a crazy idea?

I don't like it because it doesn't follow the "standard" pattern you first
mentioned. If we have to come up with a new pattern then I think the
current one is better.

Phil


More information about the PyQt mailing list