[Python-Dev] Definining properties - a use case for class decorators?

Michele Simionato michele.simionato at gmail.com
Wed Oct 19 10:51:50 CEST 2005


On 10/18/05, Guido van Rossum <guido at python.org> wrote:
> I wonder if at some point in the future Python will have to develop a
> macro syntax so that you can write
>
>     Property foo:
>         def get(self): return self._foo
>         ...etc...

This reminds me of an idea I have kept in my drawer for a couple of years or so.
Here is my proposition: we could have the statement syntax

<callable> <name> <tuple>:
   <definitions>

to be syntactic sugar for

<name> = <callable>(<name>, <tuple>, <dict-of-definitions>)

For instance properties could be defined as follows:

def Property(name, args, dic):
    return property(
       dic.get('fget'), dic.get('fset'), dic.get('fdel'), dic.get('__doc__'))

Property p():
    "I am a property"
    def fget(self):
        pass
    def fset(self):
        pass
    def fdel(self):
        pass

Another typical use case could be a dispatcher:

class Dispatcher(object):
    def __init__(self, name, args, dic):
        self.dic = dic
    def __call__(self, action, *args, **kw):
        return self.dic.get(action)(*args, **kw)

Dispatcher dispatch(action):
  def do_this():
     pass
  def do_that():
     pass
  def default():
     pass

dispatch('do_this')

Notice that the proposal is already implementable by abusing the class
statement:

class <name> <tuple>:
   __metaclass__ = <callable>
   <definitions>

But abusing metaclasses for this task is ugly. BTW, if the proposal was
implemented, the 'class' would become redundant and could be replaced
by 'type':

class <classname> <bases>:
   <definitions>

<=>

type <classname> <bases>:
   <definitions>


;)

               Michele Simionato


More information about the Python-Dev mailing list