[Python-ideas] Proposal: Use mypy syntax for function annotations

Stefan Behnel stefan_ml at behnel.de
Fri Aug 15 06:12:18 CEST 2014


Guido van Rossum schrieb am 14.08.2014 um 07:24:
> On Wed, Aug 13, 2014 at 9:06 PM, Jukka Lehtosalo wrote:
>> You could use AnyStr to make the example work with bytes as well:
>>
>>   def word_count(input: Iterable[AnyStr]) -> Dict[AnyStr, int]:
>>       result = {}  #type: Dict[AnyStr, int]
>>
>>       for line in input:
>>           for word in line.split():
>>               result[word] = result.get(word, 0) + 1
>>       return result
>>
>> Again, if this is just a simple utility function that you use once or
>> twice, I see no reason to spend a lot of effort in coming up with the most
>> general signature. Types are an abstraction and they can't express
>> everything precisely -- there will always be a lot of cases where you can't
>> express the most general type. However, I think that relatively simple
>> types work well enough most of the time, and give the most bang for the
>> buck.
> 
> I heartily agree. But just for the type theorists amongst us, if I really
> wanted to write the most general type, how would I express that the AnyStr
> in the return type matches the one in the argument? (I think pytypedecl
> would use something like T <= AnyStr.)

That's how Cython's "fused types" (generics) work, at least. They go by
name: same name of the type, same type. Otherwise, use alias names, which
make the types independent from each other.

http://docs.cython.org/src/userguide/fusedtypes.html

While it's a matter of definition what way to go here (same type or not),
practice has shown that it's clearly the right decision to make identical
types the default.

Stefan




More information about the Python-ideas mailing list