[Python-ideas] Structural type checking for PEP 484
Ryan Gonzalez
rymg19 at gmail.com
Thu Sep 17 23:19:30 CEST 2015
On September 16, 2015 3:42:20 PM CDT, "Sven R. Kunze" <srkunze at mail.de> wrote:
>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.
def process_integer_coordinate_tuples(integer_tuple_1, integer_tuple_2, is_fast): ...
vs
def process_coords(t1: Tuple[int, int], t2: Tuple[int, int], fast: bool): ...
Java's fatal mistake.
>
>> 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. :)
>
>Best,
>Sven
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Python-ideas mailing list
>Python-ideas at python.org
>https://mail.python.org/mailman/listinfo/python-ideas
>Code of Conduct: http://python.org/psf/codeofconduct/
--
Sent from my Nexus 5 with K-9 Mail. Please excuse my brevity.
More information about the Python-ideas
mailing list