[Python-ideas] TypeHinting: From variable name to type

Thomas Güttler Lists guettliml at thomas-guettler.de
Sat Oct 20 13:53:18 EDT 2018


Am 19.10.18 um 12:15 schrieb Steven D'Aprano:
> On Fri, Oct 19, 2018 at 09:18:02AM +0200, Thomas Güttler wrote:
>
>> Imaging you are developing in the django context.
>>
>> Everytime you use a variable named "request" or "response" your human brains
>> knows that this is a subclass of  django.http.HttpRequest and
>> django.http.HttpResponse.
> Not *my* human brain.


I know that I know nothing, or at least not much. My laptop does compute 
much faster than I do


> I've seen far too many variables called (let's say) "mylist" which
> actually hold a dict or a tuple (or in one memorable case, a string!) to
> unconditionally believe the name.
>
> But I'll accept that given the context, there's a very strong likelihood
> that a variable called "request" might be a HttpRequest object, and one
> called "response" might be a HttpResponse object.


Great, we agree here.

>
>> How to give the IDE this knowledge?
>>
>> One solution is the do typehinting everywhere the veriable gets used.
> You shouldn't need to. Your IDE or type-checker should be able to do
> type-inference and infer the type. You only need to add a hint if it
> cannot infer the type.
>
> If your IDE doesn't do type inference, get a better IDE *wink*


I use the free community version of pyCharm, and it often does not know

which type a variable has. A simple name2type mapping would improve

the situation a lot.


>
>> But why does the human brain not need this?
>>
>> Because it is intelligent?
> Yes.
>
>   
>> I would not call this intelligence. There is a simple
>> dictionary in the brain of the developer, which maps:
>>
>> variable-name --> Type
> Is that a fact? How do you know?
>
> How does the information in this dict get filled in?


as I already said before a docstring in the __init__.py file would

be a pragmatic solution.


> I think it is FAR more likely that it is intelligence: the human
> programmer understands the *meaning of the code* and would equally
> recognise that
>
>      myresponse
>      response2
>      reply
>      answer
>      rspns


I try to use the same variable name again and again. I guess in my

code base in 95% an instance of HttpRequest is stored in a variable 
called "request".

You say:  the human programmer understands the *meaning of the code*

Great if that is the case for you. I often look at the code and don't 
get it at all.

I wrote the lines two years ago, and today I don't understand why they 
exist.

This does not happen daily, but at least once a month.


> In other words, we *read* and *understand* the code, not just
> mechanically map names to types. That's why we have no problem with
> dynamically typed languages like Python were the one name can refer to
> objects of many different types.
>
> When the context is different, we interpret the name differently:
>
>      response = input("Continue? Y/n ")
>
>      response = chatbot.lookup(question)
>
>      response = mapping[challenge]
>
>
> would all be interpreted differently, even if the module used Django. I
> doubt any reasonable programmer would imagine that they were
> HttpResponse objects.

relax. I mean this like I said. Please relax.

Imagine you have this: reposense = obj.get_response()

First: if the variable is the return value of a method, and the method

has type-annotated the return value, then this type information gets used.

End of type detect.

If the type information can't be found from the method, then use the 
name2type

mapping which I suggest in this mail.





>
>> And this mapping dict exists once per library.
> Or more likely, doesn't exist at all.
>
>
>> If you are developing in the requests http lib, then
>> there is a different mapping. Then "response" means
>> type requests.Response.
> What if you are using *both* django and requests in the same module? You
> could have both of these:
>
>      response = something_returning_requests_Response()
>
>      response = something_returning_django_HttpResponse()
>
> in the one module.
>

Do you really care for this edge-case? I don't.

The way to get the type info is the same: Check the method,

if it has it use this. Do not use name2type mapping. End of type detection.

Then check the current file or the above __init__.py of the code. Take

name2type mapping from there.


Regards,

   Thomas Güttler


-- 
Thomas Guettler http://www.thomas-guettler.de/
I am looking for feedback: https://github.com/guettli/programming-guidelines



More information about the Python-ideas mailing list