[Python-Dev] Emotional responses to PEPs 484 and 526 (original) (raw)

Stephen J. Turnbull turnbull.stephen.fw at u.tsukuba.ac.jp
Sat Sep 3 04:03:11 EDT 2016


Guido van Rossum writes:

I just spoke to someone who noted that [PEP 526] is likely to evoke an outsize emotional response. (Similar to what happened with PEP 484.)

Emotional, yes, but I resent the "outsize" part. Although that word to the wise is undoubtedly enough, i.e., tl:dr if you like, let me explain why I have one foot in each camp.

Compare Nick's version of "scientific code with SI units":

from circuit_units import A, V, Ohm, seconds

delta: A for delta in [-500n, 0, 500n]: input: A = 2.75u + delta wait(seconds(1u)) expected: V = Ohm(100k)*input tolerance: V = 2.2m fails = check_output(expected, tolerance) print('%s: I(in)=%rA, measured V(out)=%rV, expected V(out)=%rV, diff=%rV.' % ( 'FAIL' if fails else 'pass', input, get_output(), expected, get_output() - expected ))

with

from circuit_units import VoltType, uA, mV, kOhm, u_second

expected: VoltType

for delta in [-0.5uA, 0uA, 0.5uA]: input = 2.75uA + delta wait(1u_second)
expected = (100
kOhm)input tolerance = 2.2mV
fails = check_output(expected, tolerance) print('%s: I(in)=%rA, measured V(out)=%rV, expected V(out)=%rV, diff=%rV.' % ( 'FAIL' if fails else 'pass', input, get_output(), expected, get_output() - expected ))

In Nick's version, literals like 500n ("500 nano-whatevers") require Ken Kundert's proposed syntax change. I left that in because it streamlines the expressions. I wrote the latter because I really disliked Nick's version, streamlined with "SI scale syntax" or not. Nick didn't explicitly type the *_output functions, so I didn't either.[1] I assume they're annotated in their module of definition.

The important point about the second version is that if we accept the hypothesis that the pseudo-literals like '[0.5uA, 0uA, 0.5*uA]' are good enough to implicitly type the variables they're assigned to (as they are in this snippet), mypy will catch "unit errors" (which the circuit_units module converts into TypeErrors) in the expressions. I think that this hypothesis is appropriate in the context of the thread.

Therefore, I think Nick's version was an abuse of variable annotation. I don't mean to criticize Nick, as he was trying to make the best of an unlikely proposal. But if Nick can fall into this trap[2], I think the fears of many that type annotations will grow like fungus on code that really doesn't need them, and arguably is better without them, are quite reasonable.

The point here is not that Nick's version is "horrible" (as many of the "emotional" type refuseniks might say), whatever that might mean. I can easily imagine that the snippet above is part of the embedded software for air traffic control or medical life support equipment, and a belt and suspenders approach ("make units visible to reviewers"

My version does everything the OP asked for, it furthermore makes mypy into a units checker, and it does so in a way that any intermediate Python programmer (and many novices as well) can immediately grasp. If Nick had been given the constraint that novices should be able to read it, I suspect he would have written the same snippet I did. Nick?

Footnotes: [1] I think both versions could have better variable naming along with a few other changes to make them more readable, but those aspects were dictated by an earlier post. I don't have the nerve to touch Nick's code, so left those as is.

[2] Or perhaps he did it intentionally, trying to combine two cool ideas, variable type annotations and SI units, in one example. If so, I think that this combination was unwise in context.



More information about the Python-Dev mailing list