fix indenting
[wiki.git] / python / downsides.mdwn
1 ## Python's signficant white space prevents quick experimentation with code you paste in
2
3 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.
4
5 Let me try to illustrate with an example, contrasting Python with a language that doesn't have signficant whitespace (Perl):
6
7 Let's say I have the following Perl code (with `use v5.10` for `say`):
8
9     if (1) {
10         for ( 0 .. 2 ) {
11             say "hello world";
12         }
13         # FIXME: add inner for loop?
14     }
15
16 It prints the following:
17
18     hello world
19     hello world
20     hello world
21
22 Now, let's say I want to nest another for loop inside the existing loop to produce the following output:
23
24     hello world
25     goodbye world
26     goodbye world
27     goodbye world
28     hello world
29     goodbye world
30     goodbye world
31     goodbye world
32     hello world
33     goodbye world
34     goodbye world
35     goodbye world
36
37 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:
38
39     if (1) {
40         for ( 0 .. 2 ) {
41             say "hello world";
42     for ( 0 .. 2 ) {
43         say "goodbye world";
44     }
45         }
46     }
47
48 Since the test works, you run the code through `perltidy` to clean it up. Now it looks like this:
49
50     if (1) {
51         for ( 0 .. 2 ) {
52             say "hello world";
53             for ( 0 .. 2 ) {
54                 say "goodbye world";
55             }
56         }
57     }
58
59 Now, let's talk about Python. You paste the "goodbye world" code in...
60
61     if 1:
62         for x in range (0,3):
63             print 'hello world'
64     for x in range (0,3):
65         print 'goodbye world'
66
67 ... but it doesn't give the desired output above. Rather, it prints this:
68
69     hello world
70     hello world
71     hello world
72     goodbye world
73     goodbye world
74     goodbye world
75
76 You have to go fix the indenting before you get the meaning you want. Here's the version that produces the desired output:
77
78     if 1:
79         for x in range (0,3):
80             print 'hello world'
81             for x in range (0,3):
82                 print 'goodbye world'
83