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

Phillip J. Eby pje at telecommunity.com
Sun Aug 13 04:23:00 CEST 2006

At 03:00 PM 8/12/2006 -0700, Talin <talin at acm.org> wrote:
>Phillip J. Eby wrote:
> > At 12:38 PM 8/12/2006 -0700, Paul Prescod wrote:
> > However, if you have:
> >
> >    def myfunc( x : doc("The x coordinate"), y : doc("The y coordinate") )
> >
> > There is no ambiguity.  Likewise:
> >
> >    def cat( infile:opt("i") = sys.stdin, outfile:opt("o") = sys.stdout ):
> >
> > is unambiguous.  And the interpetation of:
> >
> >    def cat(infile: [doc("input stream"), opt("i")] = sys.stdin,
> >            outfile: [doc("output stream"), opt("o")] = sys.stdout
> >    ):
>By doing this, you've already introduced an implicit requirement for
>annotations: Rather than saying that annotations can be "any format you
>want", the actual restriction is "any format you want that is
>distinguishable from other formats."

And your point is what?

>  More specifically, the rule is that
>annotations intended for different consumers must be distinguishable
>from each other via rule. This is in direct contradiction with the
>statement in the PEP that says that annotations have no predefined
>syntax or semantics -- they are required to have, at minimum, semantics
>sufficient to allow rule-based discrimination.

You've lost me here entirely.  If we didn't want unambiguous semantics, 
we'd write programs in English, not Python.  :)

>(BTW, I propose the term "Annotation Consumer" to mean a body of code
>that is intended to process annotations. You can have decorator-based
>consumers, as well as external consumers that are not part of the
>decorator stack and which inspect the function signature directly,
>without invoking the decorators.)

Um, okay.  I'm not sure what benefit this new term adds over "operation 
that uses annotations", which is what I've been using, but whatever.

>Lets use the term 'discriminator' to indicate any means, using function
>overloading or whatever, of determining which consumers should process
>which annotations. Lets also define the term 'discriminator protocol' to
>   mean any input specifications to the discriminator - so in the above
>example, 'doc()' and 'opt()' are part of the discriminator protocol.

Um, what?  Why are you adding all this complication to a simple idea?

Duck typing is normal, simple, standard Python programming practice.  We 
use objects with methods all the time, and check for the existence of 
attributes all the time.

I don't understand why you insist on making that more complicated than it 
is.  It's really simple.  Annotations are objects.  Objects can be 
inspected, or selected by type.  You can do what you want to with them.

How complex is that?

(Meanwhile, I'm going to ignore all the red herrings about freedom and 
commerce and other rigamarole that has absolutely nothing to do with 
argument annotations.)

Going forward, may I suggest you take a look at Java and C# argument 
annotations before continuing to pursue this spurious line of 
reasoning?  I'm curious to see what your explanation will be for why these 
other languages doesn't have the problems that you claim will inevitably occur.

Meanwhile, if library authors write bad code because they don't understand 
basic OO concepts like duck typing and "tell, don't ask", then their users 
will educate them when they complain about not being able to use multiple 
annotation types.

Providing good examples and recommending best practices is one thing, but 
mandating a particular semantics is another.

More information about the Python-3000 mailing list