Write Pythonic Code Like a Seasoned Developer Transcripts
Chapter: Foundational Concepts
Lecture: Flat is better than nested
0:01 For this next Pythonic concept, let's go back to the Zen of Python.
0:04 So here I am in the Python repl,
0:07 and one of the core concepts is that flat is better than nested.
0:11 Now, it turns out this is one of my favorite items here
0:15 and one of my favorite programming concepts,
0:17 because a lot of people seem to do it in the reverse.
0:20 I call this sawtooth style of programming,
0:23 we have lots of loops with ifs and conditionals
0:25 and then more loops and so on.
0:28 So let's look at this how we can apply this in Python.
0:31 Over in PyChram, we have a program
0:34 that is meant to simulate downloading the file,
0:37 and this might not be the best way to do it, obviously it is not the best way,
0:40 but it really is a simple example to highlight this flat is better than nested.
0:45 So what we want to do is we want to download a file
0:48 and we are going to do a series of tests
0:50 to make sure that we are able to download the file
0:53 or at least we think we'll be successful before we actually try.
0:55 First we are going to use this little support module here,
0:57 we are going to ask is the download url set,
0:59 if it is, then we are going to check the network status
1:02 and then we are going to make sure that the dns is working
1:04 then finally we are going to check that we have permission to access the file
1:06 and if all those things are true, then we are going to try to download it.
1:11 Otherwise, we are going to say well, this one goes back here
1:14 so it looks like no access this one here,
1:17 no dns, this one here PyCharm even has little like tiny lines
1:21 that are probably hard to see but I can follow back up,
1:23 no network and then finally this one is bad url.
1:28 This is a serious 1:29 of mine,
1:30 I hate code that looks like this, so let's write a different variation of this
1:34 which I am going to call download flat.
1:40 So let's just reverse these things,
1:43 let's look at our conditionals here,
1:45 instead of having these sort of positive checks,
1:47 yes you can do this and you can do this and you can do this,
1:50 we can return these if statements into what are called guarding clauses,
1:54 you don't let the method run if one of them is failed.
1:57 So I can come over here and say if not check url
2:01 then we'll say oh that's a bad url.
2:05 And we can unindent, that's good,
2:09 of course now that we are up here we want to return early,
2:13 we'll say if not check the network then we want to say no network.
2:19 And return, and again, unindent, it's better, again,
2:24 if not check dns, do something and then return
2:28 we'll print out that there is no dns
2:32 and then we'll unindent and finally we'll do this if not this- return,
2:41 and then if all the guarding clauses pass
2:43 then write at the very edge of our method not indented at all
2:48 as far as this method is concerned,
2:50 we can write our meaningful code and this makes it so much easier
2:53 to maintain and write instead of trying to do our actual work way down inside here.
2:58 So this is a very nice way that you can write these guarding clauses
3:03 instead of this what I call sawtooth programming,
3:05 so that you have nice, flat, easy to understand, easy to modify things,
3:10 like for example down here,
3:12 if I want to insert another test I've got to make sure
3:16 I've paired up correctly with the else down here and so on,
3:20 but most importantly you don't have to work in a hyper indented way;
3:23 this also works in loops, you wouldn't return out of the loop
3:25 but you would just do a continue with the guarding clause
3:28 instead of a test and then put the actual stuff inside the if statement.
3:32 Flat is better than nested, let's see that in a diagram.
3:35 All right, here is the code that we wrote
3:37 that was the sawtooth style with the positive checks,
3:41 make sure I can do this, make sure I can do that and so on,
3:43 and we rewrote that by inserting or converting those two guarding clauses
3:47 this flat version is much better,
3:49 we've converted all the positive checks to guarding clauses
3:52 and it's much easier to add and remove those guarding clauses
3:55 see what the else clause is that goes with it
3:58 because now it's right there and most importantly, at the end,
4:01 we get to work in a non indented way.