On 30/07/2016 04:35, Steven D'Aprano wrote:
On Sat, 30 Jul 2016 06:19 am, BartC wrote:
The language requires that blocks always contains 1 or more statements.
Fair enough, except that 0 statements are often needed
They really aren't.
The standard library uses more "pass" statements than most code I've seen,
because of the large number of abstract methods and tests that use dummy
classes or methods. If you are writing library code, or a framework, with
lots of "do nothing" blocks that the caller is supposed to override, you
may find yourself doing the same. Even so, the number of "pass" statements
is a tiny proportion of code, less than one percent for Python 3.6:
[steve@ando Lib]$ wc -l *.py */*.py | tail -n 1
541022 total
[steve@ando Lib]$ grep "pass$" *.py */*.py | wc -l
3286
Over two thirds of them are from the test suite:
[steve@ando Lib]$ grep "pass$" test/*.py | wc -l
2270
Interesting use of 'pass' in this example:
http://pastebin.com/aYJdgEL4
(I do believe he's using 'pass' as 'end'! Although he misses some out in
that case.)
I feel confident in saying that if you find yourself writing "pass" in
application code (as opposed to writing a framework or unit tests for a
library) more than one time in a 500 lines of code, you're doing something
wrong. But even if it were as high as one time in 100 lines, it is still
not an onerous requirement.
You should see how many times Ruby programmers have to write "end", 99.9% of
which are unneeded but forced on them by the language.
Think of it as a pattern. In one language, I used (Algol68-style), a
simple if was:
if a then b else c fi
which could also be written more compactly, as suits an expression:
( a | b | c )
Then the 'fi' (that is, 'end' or 'end if') is just closing the construct
started with 'fi', in the same way that ')' closes the opening '('.
As I've mentioned, Python also uses explicit block delimiters in the
form of else, elif, except, finally (and whichever ones I've misssed):
if x: a; b elif y: c; d elif z: e; f else: g
In the above syntax, it would be:
if x then a; b elsif y then c; d elsif z then e; f else g fi
Doesn't it look like there's something missing in the Python? Both the
'fi' or 'end', and the possibility of an 'h' statement.
Note the Algol68-style style is more free-format where indents are not
significant.
Anyway, if you're going to talk about annoying things forced upon you by
the language, what about:
":" after "else"
"()" in "def fn():"
"()" in "print (x)" for Python 3
"for i in range(N):" just to repeat a block N times...
That's apart from the obligatory indents which, with an 'end'-delimited
scheme, are not always necessary.
--
Bartc
--
https://mail.python.org/mailman/listinfo/python-list