[Python-ideas] Structural type checking for PEP 484

Sven R. Kunze srkunze at mail.de
Wed Sep 16 22:42:20 CEST 2015

On 11.09.2015 08:24, Jukka Lehtosalo wrote:
> On Thu, Sep 10, 2015 at 9:42 AM, Sven R. Kunze <srkunze at mail.de 
> <mailto:srkunze at mail.de>> wrote:
>     If my variables have crappy names, so I need to add type hints to
>     them, well, then, I rather fix them first.
> Even good variable names can leave the type ambiguous.

Try harder then.

> And besides, if you assume that all code is perfect or can be made 
> perfect I think that you've already lost the discussion. Reality 
> disagrees with you. ;-)

Not sure where I said this.

> You can't just wave a magic wand and to get every programmer to 
> document their code and write unit tests. However, we know quite well 
> that programmers are perfectly capable of writing type annotations, 
> and tools can even enforce that they are present (witness all the Java 
> code in existence).

You can't just wave a magic wand and to get every programmer to add type 
annotations to their code. However, we know quite well that programmers 
are perfectly capable of writing unit tests, and tools can even enforce 
that they are present (witness coverage tools and hooks in SCM systems 
preventing it from dropping).

[ Interesting, that it was that easy to exchange the parts you've given 
me ;) ]

Btw. have you heard of code review?

> Tools can't verify that you have good variable names or useful 
> docstrings, and people are too inconsistent or lazy to be relied on.

Same can be said for type annotations.

> In a cost/benefit analysis it may be optimal to spent half the 
> available time on annotating parts of the code base to get some (but 
> necessarily limited) static checking coverage and spend the remaining 
> half on writing tests for selected parts of the code base, for 
> example. It's not all or nothing.

I would like to peer-review that cost/benefit analysis you've made to 
see whether your numbers are sane.

>>     You get extra credit if your tests are slow to run and flaky,
>     We are problem solvers. So, I would tell my team: "make them
>     faster and more reliable".
> But you'd probably also ask them to implement new features (or *your* 
> manager might be unhappy), and they have to find the right balance, as 
> they only have 40 hours a week (or maybe 80 hours if you work at an 
> early-stage startup :-). Having more tools gives you more options for 
> spending your time efficiently.

Yes, I am going to tell him: "Hey, it doesn't work but we got all/most 
of the types right."

>     Granted. But you still don't know if your code runs correctly. You
>     are better off with tests. And I agree type checking is 1 test to
>     perform (out of 10K).
> Actually a type checker can verify multiple properties of a typical 
> line of code. So for 10k lines of code, complete type checking 
> coverage would give you the equivalent of maybe 30,000 (simple) tests. 
> :-P

I think you should be more specific on this.

Using hypothesis, e.g., you can easily increase the number of simple 
tests as well.

What I can tell is that most of the time, a variable carries the same 
type. It is really convenient that it doesn't have to but most of the 
time it does. Thus, one test run can probably reveal a dangerous type 
mistake. I've seen code where that is not the case indeed and one 
variable is either re-used or accidentally have different types. But, 
well, you better stay away from it anyway because most of the time it's 
very old code.

Moreover, in order to add *reasonable* type annotations you would 
probably invest equal amount of time that you would invest to write some 
tests for it. The majority of time is about *understanding* the code. 
And there, better variable names help a lot.

> It's often not cost effective to have good test coverage (and even 
> 100% line coverage doesn't give you full coverage of all 
> interactions). Testing can't prove that your code doesn't have defects 
> -- it just proves that for a tiny subset of possible inputs you code 
> works as expected. A type checker may be able to prove that for *all* 
> possible inputs your code doesn't do certain bad things, but it can't 
> prove that it does the good things. Neither subsumes the other, and 
> both of these are approaches are useful and complementary (but 
> incomplete).

I fully agree on this. Yet I don't need type annotations. ;) A simple 
test running a typechecker working at 40%-60% (depending on whom you 
ask) efficiency suffices at least for me.

I would love to see better typecheckers rather than cluttering our code 
with some questionable annotations; btw. of which I don't know of are 
necessary at all.

Don't be fooled by the possibility of dynamic typing in Python. Just 
because it's possible doesn't necessarily mean it's the usual thing.

> I think that there was a good talk basically about this at PyCon this 
> year, by the way, but I can't remember the title.

It'll be great to have it. :)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150916/f41a794f/attachment.html>

More information about the Python-ideas mailing list