connect lines
[wiki.git] / python / downsides.mdwn
1 Because I like Python and have spent some time with it, I recognize some of its downsides. These criticisms are meant to be constructive.
2
3 ## Python 3 introduces breaking changes into the language
4
5 It's common for code written for Python 2 to not work on Python 3. This is an unfortunate situation and means lots of code has been or needs to be ported. Once the dust settles and no one uses Python 2 anymore, this will be a non-issue. Until then https://pythonclock.org and http://python3statement.org are good sites to keep an eye on to see the latest news on the transistion.
6
7 Over at https://matthiasbussonnier.com/posts/planning-an-early-death-for-python-2.html which was discussed at https://pythonbytes.fm/episodes/show/5/legacy-python-vs-python-and-why-words-matter-and-request-s-5-whys-retrospective it is argued that Python 2 should be referred to as "Legacy Python" to emphasize that it is going end of life soon.
8
9 In https://github.com/python/devguide/pull/344 the date after which Python 2.x will no longer receive security updates has been finalized as January 1st, 2020.
10
11 I remember when Steve Jobs gave a [eulogy] over Mac OS 9 in a casket and I feel like the Python community would benefit from watching it. The similarities are striking.
12
13 [eulogy]: https://www.youtube.com/watch?v=G1SLCAiGkVQ
14
15 ## Python's signficant white space prevents quick experimentation with code you paste in
16
17 For me, one of the major downsides of Python is that it doesn't allow me to paste code into existing code and worry about reformating it (programmatically) later. Rather, Python insists that I adjust the indentation first or else the meaning of the code is changed. In my mind, this prevents me from trying quick experiements with code I've just pasted in.
18
19 TODO: Rewrite this example using [go fmt][] and mention the section about "mechanical source transformation" at https://blog.golang.org/go-fmt-your-code especially "Mechanical transformation is invaluable when working with large code bases, as it is both more comprehensive and less error prone than making wide-sweeping changes by hand."
20
21 [go fmt]: https://golang.org/cmd/gofmt/
22
23 Let me try to illustrate with an example, contrasting Python with a language that doesn't have signficant whitespace (Perl):
24
25 Let's say I have the following Perl code (with `use v5.10` for `say`):
26
27     if (1) {
28         for ( 0 .. 2 ) {
29             say "hello world";
30         }
31         # FIXME: add inner for loop?
32     }
33
34 It prints the following:
35
36     hello world
37     hello world
38     hello world
39
40 Now, let's say I want to nest another for loop inside the existing loop to produce the following output:
41
42     hello world
43     goodbye world
44     goodbye world
45     goodbye world
46     hello world
47     goodbye world
48     goodbye world
49     goodbye world
50     hello world
51     goodbye world
52     goodbye world
53     goodbye world
54
55 Here's where you have to bear with me... let's pretend that the code to produce "goodbye world" is long enough that you grab it from some other project you've already worked on. The indenting is off but you paste it in as a quick test and it works fine. Your code is a little ugly at the moment, but it works:
56
57     if (1) {
58         for ( 0 .. 2 ) {
59             say "hello world";
60     for ( 0 .. 2 ) {
61         say "goodbye world";
62     }
63         }
64     }
65
66 Since the test works, you run the code through `perltidy` to clean it up. Now it looks like this:
67
68     if (1) {
69         for ( 0 .. 2 ) {
70             say "hello world";
71             for ( 0 .. 2 ) {
72                 say "goodbye world";
73             }
74         }
75     }
76
77 Now, let's talk about Python. You paste the "goodbye world" code in...
78
79     if 1:
80         for x in range (0,3):
81             print 'hello world'
82     for x in range (0,3):
83         print 'goodbye world'
84
85 ... but it doesn't give the desired output above. Rather, it prints this:
86
87     hello world
88     hello world
89     hello world
90     goodbye world
91     goodbye world
92     goodbye world
93
94 You have to go fix the indenting before you get the meaning you want. Here's the version that produces the desired output:
95
96     if 1:
97         for x in range (0,3):
98             print 'hello world'
99             for x in range (0,3):
100                 print 'goodbye world'
101