[Python-ideas] Proposal: Use mypy syntax for function annotations
Terry Reedy
tjreedy at udel.edu
Tue Aug 26 07:42:31 CEST 2014
On 8/25/2014 7:58 PM, Guido van Rossum wrote:
> On Mon, Aug 25, 2014 at 4:36 PM, Terry Reedy <tjreedy at udel.edu
> <mailto:tjreedy at udel.edu>> wrote:
> I am referring to the current stdlib runtime use of .__annotations__
> directly by inspect.getfullargspec and now inspect.signature and
> indirectly by Idle calltips.
>
> def f(n:[int, 'random non-type info'])->(int, 'more non-type info'):
> pass
> import inspect as ip
> print(ip.formatargspec(*ip.__getfullargspec(f)))
> print(str(ip.signature(f)))
>
> (n: [<class 'int'>, 'random non-type info']) -> (<class 'int'>,
> 'more non-type info')
> (n:[<class 'int'>, 'random non-type info']) -> (<class 'int'>, 'more
> non-type info')
>
> (Idle currently displays the first, will change to the second. The
> display difference is more pronounced (now, at least) for C
> functions with .__text_signature__ from Argument Clinic.)
>
> To me, 'argument specification' and especially 'signature' imply
> arguments names and types, but not other stuff. Certainly, name and
> type is all that is wanted for a tip on how to write a call. Extra
> stuff would typically be noise in this context -- especially for
> beginners.
>
>
> I see two possible concerns here -- can you clarify?
>
> (1) If a function is annotated with multiple *categories* of annotations
> (e.g. type hints and html form specifiers) you want to change inspect to
> only return the type hints.
>
> (2) If a function is annotated for a non-type-hinting category (e.g.
> only html form specifiers) you want to change inspect to return nothing.
Both are covered by "I would either like non-type-hinting annotations
moved elsewhere by decorators (my older idea) *or* I would like
inspect.signature to at least optionally ignore them (today's idea). The
latter is more dependable since we control the inspect functions.
I an not too worried that anyone would use the blessed type-hint syntax
for something completely different. On the other hand, I can imagine
that there might someday be more that one annotation system in general use.
> I hadn't thought of either of these; I was only concerned about making
> sure that a static type checker wouldn't be unduly confused by
> non-type-hinting annotations.
If, for instance, everything in typing or produced by the function is a
subclass of BaseTyping or an instance of MetaTyping, then post-compile
typing objects would be easy to distinguish. Source annotations are a
harder problem.
>I assume __annotations__ should always
> return the full expression found in the syntactic position of the
> annotation
I think that should continue.
> (though decorators can change this).
Because .__annotations__ is a regular dict.
annotation syntax in code --compiler>>
initial .__annotation__ dict --decorators>>
exposed .__annotation__ dict + any other attributes added.
> I am worried about annotations other than type hints. Compact type
> hints, especially for type-opaque parameter names, should improve
> the usefulness of call tips. Extra noise detracts.
>
> If type hints were standardized so as to be easily recognizable,
> .signature could be given an option to ignore anything else.
>
> So I think you are actually not excited about any mechanism to keep
> other uses of annotations alive,
I want there to be such a mechanism even though it is does not 'excite' me .
Just as you are focused on type hints for static hints, I, *as an Idle
maintainer* who just happens to have spent considerable time on the call
tip feature, am focused on type hints for dynamic documentation.
> and you would just as well only have them used for type hints?
Too strong.
> (That's fine with me, but there is the backward compatibility issue,
I said in my first response that I don't think we should break code.
This is me speaking a as core developer and community member. I do want
multiple ramifications of annotation use considered, including run-time use.
> and perhaps legitimate cool alternate uses of annotations.
Most experiments do not amount to much, but a few, such as the metaclass
hack, certainly have. Python should continue to allow experiments.
> We still have the choice to allow only one category of
> annotations per function.)
This seems dubious to me. If strings, tuples, or dicts are allowed as
annotations, it seems to me that they can be used to combine annotations.
--
Terry Jan Reedy
More information about the Python-ideas
mailing list