[Python-3000] Draft pre-PEP: function annotations

Phillip J. Eby pje at telecommunity.com
Tue Aug 15 03:37:47 CEST 2006

At 01:19 PM 8/15/2006 +1200, Greg Ewing wrote:
>Phillip J. Eby wrote:
> > The examples there are very short
>>and simple; in fact the complete Message implementation, including 
>>imports and overload declarations is only *6 lines long*.
>>So, my only guess is that the people who looked at that skimmed right 
>>past it, looking for something more complicated!
>If it really is that short and simple, why not just post
>the whole thing? Then there's no danger of anyone getting
>lost in parts of the documentation they're not supposed
>to be looking at.

Here are the most relevant bits excerpted from the text:

To create a new kind of metadata, we need to create a class that represents
the metadata, and then add a method to  the ``binding.declareAttribute()``
generic function.  For our example, we'll create a ``Message`` metadata type
that just prints a message when the metadata is registered::

     >>> class Message(str):
     ...     pass

     >>> def print_message(classobj, attrname, metadata):
     ...     print metadata, "(%s.%s)" % (classobj.__name__, attrname)

     >>> binding.declareAttribute.addMethod(Message,print_message)

Now, we'll see if it works::

     >>> class Foo: pass
     >>> binding.declareAttribute(Foo, 'bar', Message("testing"))
     testing (Foo.bar)

In addition to defining your own metadata types, ``declareAttribute()`` has
built-in semantics for ``None`` and sequence types.  The former is a no-op, and
the latter re-invokes ``declareAttribute()`` on the sequence contents::

     >>> binding.declareAttribute(Foo, 'baz',
     ...     [Message('test1'), Message('test2')]
     ... )
     test1 (Foo.baz)
     test2 (Foo.baz)

     >>> binding.declareAttribute(Foo, 'spam', None)     # no-op

More information about the Python-3000 mailing list