Learn Python with Talk Python's 270 hours of courses

Top 10 Real Python Articles of 2019

Episode #244, published Fri, Dec 27, 2019, recorded Fri, Nov 8, 2019

We've come to the end of 2019. Python 2 has just a handful of days before it goes unsupported. And I've met up with Dan Bader from RealPython.com to look back at the year of Python articles on his website. We dive into the details behind 10 of his most important articles from the past year.

Episode Transcript

Collapse transcript

00:00 We've come to the end of 2019. Python 2 has just a handful of days before it goes unsupported,

00:05 and I've met up with Dan Bader from realpython.com to look back at the year of Python articles on his

00:11 website. We dive into the details behind 10 of his most important articles from the past year.

00:16 This is Talk Python to Me, episode 244, recorded November 8th, 2019.

00:22 Welcome to Talk Python to Me, a weekly podcast on Python, the language, the libraries, the

00:40 ecosystem, and the personalities. This is your host, Michael Kennedy. Follow me on Twitter where

00:45 I'm at mkennedy. Keep up with the show and listen to past episodes at talkpython.fm,

00:49 and follow the show on Twitter via at talkpython. This episode is sponsored by

00:54 linodeandbrilliant.org. Please check out what they're offering during their segments. It really

00:58 helps support the show. Hey there. I want to take just a moment before we get to the interview

01:03 and say thank you. It's the end of 2019. Looking back, it's been a great year for the podcast and

01:10 all the other stuff we're doing, like our courses, and it's been really humbling to get messages from

01:15 all of you about how the podcast is helping you in some way or the benefits you're getting from it.

01:21 And I just want to say thank you for listening because it's a true honor to be able to create

01:25 this podcast for you. It's a lot of work, but it's entirely worth it. It's really, really great,

01:31 and it couldn't be done without you listening and sharing it. So thank you, thank you, thank you.

01:36 Hope your 2019 was great as well. Now let's chat with Dan.

01:41 Dan, welcome back to Talk Python to Me.

01:43 Hey, it's great to be back, man.

01:44 It's great to have you back. It's been a while since you've been on Talk Python, but

01:47 not too long ago since you were on Python Bytes. That was fun.

01:50 Yeah, that's right. We practically just finished recording that. And yeah, it was great with

01:55 Cecil Phillips and yeah, I had some good links that week, I think.

01:58 Yeah, absolutely. So I'm pretty excited about 2019. It was a good year. How was it for you?

02:03 It was a very, very busy year, I would say.

02:07 Yeah, I feel like for you guys, like RealPython has come along a long ways. You've got a lot of

02:13 authors, you've kind of got this process going, you've got your editorial, your editing, and

02:17 overseeing how the content creation is going. And you're making a big difference, I think.

02:22 Thanks. That's good to hear. And yeah, it's just been this incredible year. We're at 75 authors and

02:29 video instructors published on the site now. So I want to get to 100 next year. That would be a nice,

02:34 cool achievement, I think. And we also just recently hit 2 million visitors, like unique visitors or

02:41 readers in a single month, which is kind of this incredible... Let me... I can almost... It totally

02:47 sounds like I'm super bragging here, but I literally can't wrap my brain around that. It's just kind of

02:53 nuts and really cool just to see that growth and how it's resonating and how we're getting really,

02:59 really positive feedback. Yeah.

03:00 Yeah. I think that's really positive and congratulations.

03:02 Thank you.

03:03 Yeah. And I think it speaks one to all the work that you're doing that you talked about. It also speaks

03:08 to just Python's growth in general, right? Like you're riding two curves and they're both going

03:14 in the right direction.

03:15 Yeah, that's true. So how was your 2019?

03:17 My 2019 was amazing. Didn't skip a single episode on any of the podcasts. And I think that's a pretty big

03:24 accomplishment actually.

03:25 That's huge. Yeah.

03:26 Yeah. And released a bunch of classes. I feel like we've covered some important stories

03:31 on the podcast, right? That's one of the things I try to do. We can cover every web framework

03:36 and the person who creates it and that's great and so on. But I really want to highlight that

03:40 Python is not just for web developers or like straight down the middle of the road data scientists.

03:46 Yeah.

03:46 We've had medieval Islamic philosophers and we've had people doing machine learning for particle

03:54 collisions and all sorts of stuff that might have been back in 2018. But those kinds of stories are really

04:00 interesting. I think we had a decent amount of those and I'm really happy to be able to share

04:05 those edge stories that I think are so interesting.

04:07 Yeah. Yeah. I think that's super cool. And then I think a podcast is just such a great format for it as well,

04:12 where somebody can come on the show and join you there and really give the listener a chance to

04:18 understand why this is cool and what the motivation. That's always the most interesting thing for me

04:23 when I listen to your show, figuring out like, okay, why is your guest doing that? Why are they so into

04:27 researching Islamic philosophy with Python, which are two topics that I would have never imagined

04:33 you would combine in some way. And then I listened to the show and I'm like, oh man, it's so cool how

04:37 broad this is, what people are doing with Python.

04:39 Yeah. You listen to the story and it makes perfect sense. You're like, of course you should be doing

04:43 that. And the thing I like about those types of stories is there's a lot of people that think,

04:48 oh, I'm not a programmer or it doesn't make sense for me to do that or whatever. Like,

04:52 I'm just a stock trader. I'm just a biologist. And then you hear that and you're like, all right,

04:57 if somebody can use it for philosophy, thousand year old scrolls, I should be able to find a way to

05:02 make use of this in my much more mainstream type of job. Right. It's like, yeah, obviously there's all

05:08 these amazing things people can do. They just got to be a little creative to do it.

05:10 Yeah. Yeah, absolutely. I feel like we talked about this before, but this whole idea of the dark

05:14 matter developer, someone who doesn't actually really identify as a developer or programmer,

05:19 but there's so many people out there who are practically programmers or they're working with

05:25 code, they're writing code, but they don't really see it that way.

05:29 A big enough part of the community to actually come along and come to the conferences or blog about

05:34 programming. They're probably blogging about something else that they care about. Something

05:37 like that, right?

05:38 Yeah. Yeah.

05:38 Yeah. Sweet.

05:39 Cool. Well, let's talk about what we're going to focus on for this show. So the idea is we're going

05:43 to take 10 of your popular bookicles, book articles, your articles-

05:49 That should be a new one.

05:50 Yeah.

05:50 So we're going to take our near book style on real Python and just pick 10 of them. We're going to

05:56 call it the top 10, but it's not necessarily top 10 by your traffic. It's kind of the ones you wanted

06:02 to highlight from the year, right?

06:03 Yeah. So yeah, I really wanted to give a chance to sample a wider variety of topics because if you go

06:11 purely by traffic numbers, things are just going to get overshadowed by popular terms that people

06:16 search for on Google.

06:16 Look, it's for Django articles or whatever, right? And just because people are searching for that or

06:19 whatever.

06:20 Yeah. And so, yeah. So we kind of assembled a list of 10 articles that we wanted to highlight and then

06:26 go over and then share with you.

06:27 All right. Where are we starting?

06:28 Sweet. So we're starting with an article that's called How to Run Your Python Scripts by

06:34 Leo Danis Pozo Ramos. And it kind of sounds simple, right? You just go-

06:41 Right. Don't you just say python space script.py?

06:45 Yeah. I mean, that's what we do most of the time, right?

06:47 Some of the time, yeah.

06:48 Hit control R or something like that. F5. And this article is cool because it, of course,

06:56 talks about that. But then it goes really, really deep into the behind the scenes and

07:02 what some of the other ways are that you can possibly use to run Python code. So you could

07:07 just load the string from Office Script and then just eval it. Or there's the import lib module

07:14 in Python 3 that you could use. And there's all kinds of other more complex methods where you get

07:21 deeper and deeper into CPython.

07:22 You could do python space dash C and like some code, right?

07:27 You could also do that if you wanted to run a code snippet from the command line. And I just love this

07:32 article because it starts with the really simple and straightforward and like main use case. And then

07:36 it goes deeper and deeper and deeper into all the different alternatives. And you know, what the

07:41 difference is between running a module with Python dash M versus actually just running it by Python

07:48 space from the command, Python space and then the file of the file name and running it from the

07:53 command line. And yeah, for that reason, you know, I wanted to highlight that article.

07:57 Okay. Yeah, that's really cool. And one of the things I like about a couple of the articles that

08:01 we're covering are I look at the title and I go, yeah, I know that. And then I look at the article

08:07 and it's like, I don't know how many words, but it's like, you know, readability suggests this might

08:11 be an over an hour to read this article. I'm like, wait, I thought I just, that was simple and I knew it.

08:15 And you know, when you, whenever I, that kind of makes me think, I'm like, oh, I actually might learn

08:20 something here. If I just pay attention, like this is going deeper or into a different area than,

08:25 because if I thought it was that simple and it's this, then it's clearly I'm missing something.

08:28 Yeah. As the kind of the person running the site and working on the platform there, like I love

08:33 seeing surprises like that because it's always a team of us that's working on the article. So we

08:37 have like multiple review stages and we review the outline and then we review the script and there's

08:43 like a technical review and just seeing these things kind of grow and you'll become a real Python

08:49 article is, I just really enjoy that process and being a part of it. So yeah, this is like a great

08:54 example, I think, of that. Yeah. Yeah. Quite cool. So covers a bunch of stuff and probably something,

08:59 you know, there's definitely a few suggestions in there that I didn't know. All right. What's number

09:04 two? And number two is called 13 Project Ideas for Intermediate Python Developers by Habib

09:11 Shopeyou. And this was born out of a lot of questions that we received over email or Twitter and

09:19 also most recently in our real Python community Slack where people were asking, like, I feel like

09:25 I kind of know how to use Python, but I don't know what I should build. I've learned the language. I know

09:30 loops. I know how to do strings. I create a dictionary, get stuff in and out of it. But what can I actually

09:35 build that like is the next step? Exactly.

09:37 Yeah. Because that's often very challenging. It's not just challenging on like maybe a lack

09:42 of creativity. It's challenging in like, oh, you want to be cool to build Instagram? Like, no,

09:47 it wouldn't be cool to build. It'd be very hard to build. It's like millions of lines of code.

09:50 You know what would be cool to build? As a timer, like, no, it's boring and it's too short. Like,

09:53 what is the right size where it's challenging, but I can reasonably expect to do it if I put in some

09:59 effort? Yeah. And that's a really hard one, right? Like I was back in the day when I learned how to

10:03 code or first started. I mean, I guess you never really stopped learning how to program.

10:07 I was in these like game development forums and there was every single week there was like

10:12 a new person joining and they were like, I want to build this MMORPG or like, I want to build this

10:17 like massive thing. And so everybody was working on these like massive projects that never really

10:21 went anywhere. And I think that could be really, really frustrating. And so my answer to that question,

10:25 you know, what should I build as an intermediate developer was usually like, just pick whatever,

10:29 you know, just take a command line app that you use and try to emulate, like try to write your own

10:34 version of it. But the problem is that doesn't really work for some learners, for some students.

10:39 And so we wanted to give them a list with ideas, you know, here's some things that we think you could

10:42 probably pull off. You have a fighting chance of actually like building this app, right? And it's

10:47 not going to be a world of Warcraft, but it's going to be a cool like alarm tool or a little file

10:52 manager or a little note-taking application. Yeah. Give us a sense of some of the ideas you got there.

10:58 Yeah. So the ones that I just mentioned.

10:59 Yeah, exactly. So MP3 player, URL shortener, file rename. Yeah. That's really nice.

11:08 Contact book, I think is also something interesting where, you know, there's different ways you could

11:12 store the data could just be like a little, yeah, like an address book where maybe you ask, you know,

11:18 it could be as simple as just storing a dictionary to a text file, or then you could get progressively

11:23 more interesting there and have a little database maybe.

11:26 You could use SQLite and then you could start using SQLAlchemy because, you know, you don't

11:30 want to be writing inline SQL and then, you know, become little Bobby tables.

11:35 Yeah, that's right. Well, you know, someone could take you a great free MongoDB course.

11:39 Yeah, exactly. Yeah. They could do a MongoDB back one.

11:42 All kinds of options there.

11:43 Yeah. They could totally like level these up. They could put them online, all kinds of cool

11:46 stuff. Yeah. So I like it. And you got it broken down to web, GUI and command line. That's pretty

11:50 good break.

11:50 Yeah, that's right. Yeah. We try to give like a high level overview and then depending on what

11:54 you're interested in, you could pick the right project for you.

11:57 Yeah. Super. All right. What's next?

11:59 All right. So I think we are at article number three. And what I wanted to highlight there is

12:05 the article is called Three Ways of Storing and Accessing Lots of Images in Python by Rebecca Stone.

12:11 And I think this article is cool because, again, it's something that I never really thought about

12:16 before. You know, I was like, OK, you know, my Django app uses a bunch of static images.

12:21 There's just a folder in there.

12:22 Right, right. That's slash static slash IMG or something, right?

12:25 Yeah. But what if that maybe doesn't work so great anymore? I think you're storing a

12:31 massive amount of images. You know, you have some, I don't know, some robot, some probe that's going

12:36 to Mars and you have lots, you have like terabytes of images. And where are you going to store them?

12:40 How are you going to make this manageable?

12:42 Right. Are you going to create some kind of like automated IoT doorbell that always snapshots,

12:48 whatever's close, right?

12:49 Yeah. And if your house gets broken in a lot, eventually you have too many images and you got

12:54 to figure out what to do with them.

12:55 That's right. Why are all these people at my house? You're killing my storage.

12:58 All right. So what are some of the suggestions?

12:59 Yeah. So it goes, the article goes into three techniques there. So the first one is, you know,

13:05 just like store them on disk as .png files or, you know, JPEG or what have you. And then the

13:10 second option is using a memory mapped database called LMDB. And the third option is using a

13:16 hierarchical hierarchical data format like HDF5. And the latter two, I'd never really heard about before.

13:27 But it turns out, of course, that there is a lot of Python tooling available for these things.

13:34 And so they provide a number of interesting features. So for example, there's a compression

13:39 that you could use. So to potentially limit your disk usage. And there's just lots of good tooling,

13:46 if that's a problem that you're facing, that people can use with Python.

13:50 Yeah, this is interesting. Like I'd never heard of LMDB, but apparently it's lightning memory mapped

13:55 databases, which sounds fascinating.

13:57 It sounds, yeah. It's like, I should definitely check that out. Find a use case for that. Cause that

14:01 sounds cool.

14:01 Yeah. You got to build that, that magical doorbell robot.

14:05 Right. Maybe selfies for robots or something. They just do it all day long. All right. Awesome.

14:10 All right. So what's number four?

14:12 Number four is called Speed Up Your Python Program with Concurrency by Jim Anderson.

14:17 Oh, this is one that definitely, definitely resonates with me.

14:20 It's, yeah, you have a lot of great material on asyncio and working with parallelism and concurrency

14:27 with Python. And the idea for this article was to give the reader an overview of what different

14:36 types of concurrency that are out there. And what does it mean if a program is CPU bound versus IO bound

14:41 and which options make sense using, you know, when should you use threading versus a multi-processing

14:47 or asyncio. And we also added an interactive quiz to it. So that, you know, if you're reading this,

14:54 you can really make sure, okay, I actually understood these concepts because they're pretty

14:57 difficult to take in the first time.

14:59 Yeah. That's the kind of thing that just needs to wash over you several times until you're like,

15:03 all right, I'm starting, I'm starting to get the feel of this thing.

15:05 Yeah. Get burned by it a couple of times and you're like, oh no, I got to re-architect this again.

15:09 Exactly. And I think this is important in Python because I think Python's concurrency story

15:14 is both amazing, but non-obvious in some ways. And what I mean by that is a lot of programming

15:21 languages, you can leverage computational concurrency by using just threads, right? Because I got, you

15:27 know, this thing believes it has 12 threads in my MacBook here. It has six hyper-threaded cores,

15:32 right? So if I were to like write a single-threaded program, it'll get like eight or 9% CPU usage

15:37 and that's it. So if I want to make that go faster on a lot of languages, C++, C#, whatever,

15:41 I can just create a bunch of threads and it can start running on all of those different threads.

15:45 But in Python, we have the gill, so it doesn't work, right? And that's, I think, actually caused a lot

15:50 of challenges because people say, well, that means Python's concurrency is broken. It's not broken.

15:55 It just needs a clearer mental model of when to apply each technique.

15:59 Yeah. It's kind of like a manual gear shift, right?

16:01 Yeah. Yeah.

16:02 It's not broken, but the car is also not going to go.

16:04 It drives in the day, but it won't drive at night. Put it in night mode. It won't go.

16:09 Put it in N.

16:11 Yeah, exactly. So for example, if it's IO bound, probably what you want to do is something

16:17 to do with asyncio, right? But if it's computational, you really need to do, at least for the moment,

16:22 something with multiprocessing.

16:24 Yeah.

16:24 And so it compares those types of things, huh?

16:26 Yeah, exactly. And like I said, you know, we have this quiz at the end that you can take

16:30 and then really make sure, okay, I understand what the differences are between these concurrency

16:35 models.

16:35 This portion of Talk Python to Me is brought to you by Linode. Whether you're working on a personal

16:41 project or managing your enterprise's infrastructure, Linode has the pricing, support, and scale that you

16:47 need to take your project to the next level. With 11 data centers worldwide, including their newest

16:52 data center in Sydney, Australia, enterprise-grade hardware, S3-compatible storage, and the next-generation

16:59 network, Linode delivers the performance that you expect at a price that you don't.

17:03 Get started on Linode today with a $20 credit and you get access to native SSD storage, a 40-gigabit

17:10 network, industry-leading processors, their revamped cloud manager at cloud.linode.com,

17:15 root access to your server, along with their newest API and a Python CLI. Just visit talkpython.fm

17:22 slash Linode when creating a new Linode account and you'll automatically get $20 credit for your

17:27 next project. Oh, and one last thing. They're hiring. Go to linode.com slash careers to find

17:32 out more. Let them know that we sent you.

17:34 Number five.

17:37 All right. Number five. Build a recommendation engine with collaborative filtering by Abinaf

17:43 Aitzeria. And what do you think this is?

17:47 I'm reading a real Python article and it says, you might also like these other three or something

17:53 like that or talk Python course. You might also like this one, right? It's a good follow-on

17:57 for various reasons, right? People who took this course usually took that one next or people who

18:01 read this article also like shared that other article or something.

18:05 Yeah, exactly. It's about building a recommender or recommendation engines like you would have on,

18:10 you know, pretty much any larger website like Netflix or Amazon. They're all recommending you

18:16 products or movies that you might enjoy based on what you already watched. And a lot of times what

18:22 they do is they look at, kind of build a profile of the things that you watched and then kind of

18:28 finding similar users, other users on the platform that watched those movies and enjoyed them. And

18:33 then based on that, trying to figure out, okay, what did these other people also watch and enjoy?

18:37 And maybe we can recommend that back to you and then hopefully you'll have a good time on the

18:40 platform.

18:41 Yeah, that sounds really cool. It sounds like very relevant to data scientists and there's probably

18:45 a lot of data science algorithms in there, huh?

18:47 Yeah, absolutely. I think there's some cool stuff happening there and there's some matrix math.

18:51 What I like about this article that I really like how it turned out from like a typesetting

18:56 perspective. So that was like a really big aspect of kind of building the new real Python

19:01 CMS and hosting platform and built on Python 3, Django 2 and all the good things. It was a lot of fun

19:07 building it and working on it. And I mean, I'm still working on it. And I think this is just a cool

19:12 showcase for that also, you know, where you get some graphs in there, you get some interactive,

19:16 or you get some code snippets that you can copy and paste and you get some math typesetting there.

19:21 And I think that makes it very engaging to the reader as well. And yeah, and it's just a cool

19:28 topic. Like I'm just fascinated by those things, you know, how you can use the wisdom of crowds or

19:33 whatever that way. You know, you could say like, well, we have enough people using the platform,

19:36 you have enough people watching Netflix. And then all of a sudden I can get these amazing

19:40 recommendations for other things I would have never thought about watching.

19:42 Yeah. You help it make it better for other people without even knowing it, right?

19:45 Yeah.

19:45 Your actions are there and used for good. Yeah. So it talks about things like K nearest neighbors

19:50 and probably the fundamental algorithm there that's being used, right?

19:55 Yeah. I believe it's for this particular recommendation system technique called collaborative

20:00 filtering. But there's also other approaches that I can't really speak intelligently about.

20:06 Yeah, sure. There's even some cool recommendations like the surprise recommender system, which is a

20:11 Python scikit-learn extension, right? So you can install scikit-surprise.

20:17 It's a cool name for recommender system.

20:19 That's a great recommender, right? Like surprise, we actually can recommend something useful. This is

20:23 not like wasted space here. Yeah.

20:26 Cool. Yeah. So if people are interested, they can check that out. And also I noticed it's kind of

20:31 got this bimodal way of working which says, well, if you want to use pip, here's how you do it. If you want to use

20:35 Anaconda, here's how you use that as well, right? So this one seems like there'd be a lot of folks

20:40 using Anaconda as their Python distribution to work on this.

20:44 Yeah. I think if in the data science space, Conda seems to be quite popular. And so typically we kind

20:50 of standardize like for the articles, we standardize on just using pip because that's kind of the lowest

20:54 common denominator. Yeah.

20:55 But in this case, you know, we felt like it makes sense to be closer to where the target audience might

21:02 be there. Right, right. Take it to the data scientists, right?

21:04 Yeah.

21:06 That's really cool. So I love it. It's a good one.

21:08 Number six on our list here.

21:11 Right. So this one might be a bit surprising, but it is called Your Guide to the Python Print

21:16 Function.

21:16 And this is the one that I was talking about when I thought like, okay, I'd know this thing.

21:20 Yeah.

21:21 Like, wait a minute, maybe I don't know this thing.

21:23 So this is more like a book about the Python print function by Bartosz Zaszinski. And this is just this

21:33 incredible deep dive into the print function slash print statement in Python 2. Because again, you know,

21:39 would think, okay, maybe this is maybe a paragraph or two about what you can do with the print function.

21:43 You know, you can pass some arguments to it.

21:45 It requires parentheses now. It didn't used to.

21:47 Exactly. Right. Like what else is there to say? And then it goes really, really deep into the

21:52 history of the print function and some common use cases that maybe you might not associate with the

21:58 print function directly upon first glance. You know, for example, well, how can you build a cool

22:03 console user interface? How can you do colors in the terminal? And how can you pretty print if you

22:10 have a nested data structure, like some JSON that you parsed into dictionary? How can you make sure

22:14 it actually looks good when you print it out to the console or some debug window? And so it's not

22:20 just purely about the print function, but all the kinds of different best practices and ways you can

22:25 make printing better in your Python programs.

22:28 Yeah, that's cool. No one wants to try to use a minified dictionary for debugging.

22:33 Nope. That's very annoying. I usually take those and then paste them into the black online

22:39 format. I get like a nicer representation. Yeah. Yeah. Yeah. So we cover some of the things I

22:45 think are actually not super obvious to new folks coming from the language, right? Like

22:50 that's right. If you come from other languages, you might not know that you can actually use a

22:55 keyword argument to set the end to be instead of a backslash end to be like a comma and print on one

23:01 line with a bunch of commas or something like that or the buffering, right? If I'm trying to do

23:06 something computational and print out as the computation is happening, a lot of times that

23:11 can get buffered up and then it like all shoots out at once. Or, you know, like if you're like

23:15 delaying waiting on something, you want to actually see all the output. Like there's a bunch of little

23:19 tips like that in there, right? Yeah. Yeah. And like with everything, it's there's a deep rabbit hole.

23:24 Yeah. Down the rabbit hole you go, right? Yeah. I love this kind of article where you think, okay,

23:30 we're going to scratch the surface here a little bit and then we're done. And then there's all kinds

23:34 of interesting other things you could do or just learn why certain things work the way they do. You

23:40 know, ANSI or ANSI escape sequences for making the making colors in the terminal. When you read about

23:48 them, they kind of looks like this incredibly confusing format. And then you learn a bit more

23:52 about the history and you know how it relates to the sort of these old school terminals of the old

23:57 like mainframe computers and how, you know, it's just a format that has grown over decades. And

24:03 well, sure, we could all, you know, throw it away and maybe engineer something from scratch. But it's kind

24:07 of cool to understand, you know, if I'm, if I, I don't know, you know, boot up my Windows computer or

24:12 MacBook in, in 2020, why it's still supporting that stuff and how it goes back, you know, 50 years.

24:18 Yeah. Well, another thing that I think makes a night and day difference for these simple little

24:23 command line apps is color. More of those should use color, right? If you're saying in the help output,

24:29 it would be great to show the required arguments is like one color and the optional ones is another.

24:34 And it's incredibly easy. But if you don't know to do it, or you think it's hard, or it's hard to do

24:40 cross platform or whatever, then you won't.

24:42 Yeah. Yeah. Oh, speaking of color there in the terminal, one of my favorite tools is the B Python

24:47 REPL.

24:48 B Python?

24:49 B Python. So the letter B, and then Python, one word. It's a Python interpreter, like a Python, not an

24:56 interpreter, but a REPL environment. That is just like the when you start Python from a command line,

25:01 you get your little prompt and you can type a Python code into it and run it. But it does

25:05 syntax highlighting. So it'll give you beautiful colors in the terminal.

25:09 Nice.

25:09 And it also does autocomplete, which is kind of cool.

25:12 So we use that all the time in our video courses and examples. And people always ask like,

25:18 oh, what's that? What's that tool? I want to use that too. And it's great. Like,

25:21 like the color really adds a lot of value.

25:23 It adds a lot. Yeah. I maybe, I think I've heard of B Python. I haven't used it. I'm all about the

25:27 PT Python. Are you familiar with that?

25:29 Oh, that's great too. Yep.

25:29 Yeah. It's like Emacs in the REPL kind of. Yeah. It takes me back to my Emacs days. So last thing,

25:36 like we go on and on about this, like incredibly for a really long time about printing. But there's

25:41 one thing that's in here. I think that's, that's pretty interesting that they talk about that I guess

25:45 also surprised me. I didn't really think about it is mocking the print function for unit tests.

25:50 Yeah. That's a kind of a surprise, right? But it's, it's actually a pretty annoying problem. If you,

25:56 if you want to write tests for a program where in the test, you actually want to make sure it's

26:00 printing the right stuff. Well, how do you do it? You know, how can you actually redirect that output

26:04 into some kind of buffer so you can inspect it and say, okay, we got the output that we wanted.

26:09 I called this and it said, enter this or whatever, right? Like the prompt that we were expecting or

26:14 something. Yeah. Yeah. Yeah. Yeah. Pretty cool. All right. Well, let's move on because it is the

26:20 print function, but it is actually really, really interesting. And what are we up to number?

26:24 I am trying to check. I think number seven, this is number seven. Yes. Number seven. Yeah. And it

26:30 goes right along to number eight in a sense. So how to write beautiful Python code with PEP 8.

26:36 Yeah. So this is a cool article by Jasmine Feiner and it's about the PEP 8 style guide and sort of

26:44 a beginner friendly intro to PEP 8, why it exists, how it can help you format your code in a way that

26:51 other Python developers will expect and appreciate. And I think it's, it's a really good one because,

26:58 you know, it breaks it. Like if, when you read the actual PEP 8 can be feedback that I heard in the

27:04 past, it's just very, very overwhelming to take it all in and take all the examples in. So we try to

27:08 break it down and give you a good overview and then point you to the original PEP so you can do the deep

27:15 dive. Yeah. It's really cool. And you know, it's one of those things that's really important that,

27:20 so you look like you belong, right? If you start doing stuff that is, you know, Java style or C#

27:28 style and someone says, yeah, I'm interviewing for a Python job. And here, let me write a little

27:34 code for you and you start using like camel case method names or something like that. You're like,

27:40 not so sure you're a Python developer. You don't look like you're from around here, right?

27:45 Yeah. First impressions matter, I guess.

27:48 Yeah. And you know, once you know the conventions, some of those conventions have meaning,

27:52 right? Like the underscore has a certain meaning and things like that. And so it's not implicitly

27:59 obvious from that thing that what the meaning is. But once you study it, then you get to know,

28:04 right?

28:04 Yeah. Yeah. I'm actually, I wanted to ask you what's, is your talk Python, is the code for the

28:09 talk Python platform? Is it PEP 8 compliant?

28:11 Is it PEP 8 compliant?

28:12 It's both for the platform it is, I would say PEP 8 compliant. And I try to do that in the courses.

28:18 Probably the way I do that most is just running, like working on everything in PyCharm and PyCharm

28:24 will highlight stuff and make it obviously, it'll like, as you type a highlight, it'll go, no,

28:29 no, no, no. There's something clearly wrong. Like you don't have an underscore, you have camel case

28:33 on a variable name. Stop doing that. Right. And so, yeah, I don't run anything like black across

28:38 the whole thing. The only thing I've run entirely across the whole code base, not across the courses

28:44 because it's recorded. So it'd be weird to change it. But in terms of the platform, I've used Flint.

28:49 Are you familiar with Flint?

28:50 I feel like I heard about it. Is this another auto format?

28:54 It has, it's a very special tool, but I love it. What it does is it will take all the various string

29:00 formatting styles of working with strings. So percent, value value, or the format, something

29:08 or other, and so on. And it turns on all the f-strings.

29:10 Oh, that's cool.

29:11 Yeah. It'll just rewrite your code, like rewrite all your f-strings.

29:14 I know a certain core Python developer who would love that. Marietta.

29:17 She does all these awesome stickers.

29:20 Yeah, yeah. Yes, man. Yeah. So I ran it. In the early days, it had a couple of bugs when you were doing

29:26 numerical formatting, like this number, comma, colon, comma, like 0.2F. Like that would get freaked out.

29:34 But yeah, like after a couple of iterations, it's really quite good.

29:37 Oh, that's cool. I think, yeah, I got to run that. That's great.

29:40 Yeah. So I just ran it against like 20,000 lines of code across the training site and the Talk Python

29:44 and Python Bytes websites. And I think there was like maybe one mistake. So I just,

29:49 I looked at the diff before I checked them all in and just said, actually this, you know,

29:52 one out of a thousand, there's this mistake. But yeah, yeah.

29:55 I think actually those are probably pretty much gone. But yeah, anyway, and it's not PEP 8, but it's a sort of a continuation.

30:00 Yeah. And I think with this stuff, I feel like we've got to be clear, like it can often be ambiguous,

30:05 right? Like any, any sort of code style guide, like PEP 8 or what have you, you know,

30:09 in other languages, it's usually not at the end of the day, like naming is a big part of a

30:15 developer's job, I think, you know, and in picking names that are actually communicating the intent well and other people can understand.

30:21 And so it's, it's, it's not going to solve that problem because, well, even though if,

30:26 you know, if you're following PEP 8 to a T and you're using all the upper and lowercase letters

30:30 in the, in the right way, and your naming isn't, just doesn't make sense, then that's also not

30:35 going to be great. So it's, yeah, another example might be struggle.

30:38 Yeah. You're doing a list comprehension and it's all on one line, right? It's got the,

30:43 you know, and for N and such and such, if N such and such. And it happens to be 79 line characters

30:49 long. So it's on column 79. It's fine. You don't need to wrap it, but it's like super hard to

30:54 understand. It would make sense to have that three lines, the select value, the loop, the,

31:00 the collection is going through and the, the test, right? It would be much better. But PEP 8 doesn't say,

31:04 well, if it's 79 lines and complicated, it should be broken up. But 80 lines is, you know,

31:10 like the hard limit and things like that, right? Yeah. Yeah. And so we've got to think beyond it.

31:13 Are you following the 79 characters limit in your code basis?

31:17 Do I follow? Sometimes. There's a few times where I don't like, so if I have a, a raw string or

31:24 multi-line, not raw string, a multi-line string where you do triple quote, then like there's a bunch of

31:28 stuff and then triple quote to close it. I don't know of a way to not do more than 80 lines. If what needs to

31:33 be in the string is more than, or 80 columns, but he would still complain to me like, oh no,

31:37 this line is 120. I'm like, yeah, but you show me how to fix it and we'll have a conversation,

31:41 but I can't fix this, right? Yeah. Without completely going, you know what, we're going to have a string

31:45 concatenation like to nobody's end rather than this multi-line string. So there's a few edge cases,

31:51 but I try to. Yeah, me too. Like ever since I started using black, you're like, black's going to change

31:55 it anyway. I think you can tell it like to use a different line length limit. Like I feel like that's,

32:00 that's always something that comes up where it's like a kind of controversial topic where should

32:05 you follow the 79 character limit is even another, there's like a 72 character limit recommendation

32:10 for doc strings. Like I try to follow that as well. I have like my, you know, these like a little,

32:15 little gutter margin set up in the editor. So yeah, exactly. That's cool. But then at the,

32:19 sometimes I'm thinking, okay, but wouldn't it be nice just to go a hundred characters or longer?

32:22 So I think, I think like whatever number of people pick, as long as you're consistent,

32:25 it's, it's probably a good thing. Yeah. It's somewhat contextual.

32:28 This portion of Talk Python To Me is brought to you by Brilliant.org. Let me knock something off

32:35 your holiday to-do list. Gifts. Spread the love to your loved ones by gifting them Brilliant.

32:41 This really excites me because it's such a fun way to nurture curiosity, build confidence,

32:46 and develop problem-solving skills crucial to school, job interviews, or to their career.

32:50 Brilliant's thought-provoking content breaks up the complexities into bite-sized,

32:55 understandable chunks that will lead them from curiosity to mastery. Go to talkpython.fm

33:01 slash brilliant and grab a gift subscription to help your loved ones finish their day a little

33:06 smarter this season. That's talkpython.fm/brilliant, or just click the link in the show notes.

33:13 We talked about Pep 8. Now how about Article 8? Article 8 is about the Python Lambda function. So it's called

33:21 How to Use Python Lambda Functions by Andre Bourgo. And yeah, I wanted to highlight this one because

33:28 Lambdas and Python are a topic that can be challenging. I think it's something that a lot of times you don't

33:37 really have to, you don't really work with. And so you don't get a lot of experience working with it.

33:41 And then when there might be a situation where it's actually useful, for example, if you want to

33:45 sort a list or something sorted by a custom key, then if you don't know about Lambdas,

33:50 it's going to be a frustrating experience.

33:52 Right, right. Like I got to write this other function and that's kind of weird. But yeah,

33:56 so they're one of the things that when you learn them, you're like, man, that is cool. I can't

34:01 believe I can think of immediately 10 places I would use this, but they're not obvious that they exist

34:06 or that you could use them until you see them, right?

34:07 Yeah, that's right. And it's, what's the quote there? Like the dose makes the poison or what?

34:12 I only know the German version.

34:14 Yeah.

34:15 Die Dose macht das Gift.

34:17 Yeah.

34:18 So the dose makes the poison.

34:19 Yeah. Basically you don't want to, you want to apply it. It's like salt, you know, you don't

34:24 want to overdo it with the salt because then the food's going to taste it.

34:27 Yeah. Yeah. A pinch will do you. Absolutely. So yeah, that sounds about right.

34:31 Yeah. And so, so this article goes into some use cases and also into the kind of the language

34:37 history or why are these types of functions called lambda functions and how does this relate to this

34:44 thing called lambda calculus that was invented in the 1930s. And we go back into some of the computer

34:50 science stuff.

34:51 Yeah, that's cool.

34:52 So you can also learn about that.

34:53 You know, another thing that I think is interesting that gets very little attention,

34:57 I suspect this is happening to a non-trivial number of people and they don't even know is closure.

35:03 Right? So closure is the idea that like I have a variable that's either available in the local

35:08 method or it's a global variable. Most likely it's like a local variable on that method.

35:14 We're using the lambda and you say it in the function body, the lambda body, but not as an argument.

35:22 Right. It's somehow magically.

35:23 Kind of capturing that.

35:25 Yes.

35:25 I find this so hard to explain just in audio only because when you see it with an example,

35:30 like in the article, it's to me at least a lot easier to wrap my head around it.

35:35 But yeah, let's give it a shot.

35:37 Like can we.

35:37 Yeah. Well, some really interesting stuff happens with closure, right?

35:41 It's not just that the variable is like passed, but it's remembered.

35:46 It's remembered across function calls.

35:49 So even if you change it and then you call the lambda again, it will work with not the

35:53 original value like a compi, but it'll work with a changed value.

35:56 Which can really bite you also if you're referring to a mutable object and you think you've kind

36:02 of captured the full state of this object and then it gets changed under you.

36:08 which I think this is also kind of maybe the danger of using lambda is that if you don't

36:13 understand how closures work or when that effect kicks in, that you might be writing code that

36:21 actually breaks under unexpected circumstances.

36:24 Yeah.

36:25 And it can be incredibly hard to understand why if you have no idea that this is happening.

36:29 On the flip side, you can use it for great power as well.

36:33 Like let's just go to like something super simple.

36:35 I want to sort a list.

36:36 I want to say key equals lambda of item, colon, do something with the item, right?

36:43 But maybe there's other variables or other data that's in the function that you want to use to

36:50 decide how you sort.

36:51 Like if it's below this cutoff, I want it first.

36:54 But if it's after this cutoff or like, you know, it's somehow you've got to compute with some other

36:59 data that's not purely just the item.

37:01 Like if you wanted to sort, you had an address book with, I don't know, name and year of birth

37:06 and you wanted to sort it by some calculated value.

37:10 Yeah.

37:10 So like both of them.

37:11 Right, right.

37:12 So if they don't have a date of birth, you could have like, here's the default date of

37:15 birth we're going to use.

37:15 Right, yeah.

37:16 Right, right.

37:16 Substitute something.

37:17 Yeah, they're all going to be born in 1970 or something.

37:19 Who knows?

37:19 So you could like have that as a local variable, but then include that in your sort lambda.

37:24 But the function that's getting called, it only takes the item and the list doesn't know

37:30 about your need of this other variable.

37:32 It's not going to pass it in, but you can just use closure to just capture it and just like

37:36 bring in more arguments into your lambda than would otherwise be available.

37:40 And that's a super powerful thing you can do.

37:42 Yeah.

37:42 Yeah.

37:42 I think that probably the main use case, what I personally use them for, there's also

37:47 a section in the article that talks about whether lambdas are, we can consider them pythonic

37:53 or not.

37:54 Because in PEP 8, which we just talked about, there's actually a recommendation there that

37:59 says you should always use a def statement.

38:02 So define a proper function instead of an assignment statement that binds a lambda expression directly

38:07 to an identifier.

38:07 And so this is like a strong discouragement to using lambdas.

38:11 I think mainly when you actually, you want a named function.

38:15 I think anytime you actually want a named function, you should probably not use a lambda.

38:18 But if it's like a one-off thing, that's where I would use it.

38:22 Yeah.

38:22 You even talk about in your article a little bit, like anonymous functions, meaning they

38:26 have no name.

38:28 You're passing them somewhere.

38:29 You're modifying the behavior like of the sort or whatever, but you're not naming the

38:34 thing doing that.

38:35 Yeah.

38:35 That's right.

38:36 And with great power comes great responsibility.

38:40 That's right.

38:41 I think one of the key essence of the lambda, like decide, should I make a separate function

38:47 or should I make a lambda function?

38:49 I think one of the key differences here, or the key decision, at least for me, is, is it

38:54 going to be clearer to just plunk the implementation right here than to give it a good name and put

39:01 it somewhere else?

39:01 So if it made a lot of sense to give it a good name and put it over there, because it's kind

39:05 of complicated, but the name tells you what it does and then use that as the sort, great,

39:10 do that.

39:10 But if it's like, I'm going to sort just by like sort of list of customers, it's just

39:15 lambda of C colon goes to C dot name.

39:17 Okay.

39:18 Like it would be more confusing to move that away because then you have to be sure like

39:22 sort by name.

39:23 You're like, oh, wait a minute.

39:24 Descending or ascending?

39:25 Well, it used to, they renamed it to say sort by name ascending, but then they actually changed

39:29 implementation to descending, but they forgot to rename it because they're afraid to break

39:34 the code.

39:34 And just like, there's all sorts of weird stuff if you move it away.

39:38 So if it's clearer to have it like in line than lambda, otherwise not lambda.

39:43 That's my test.

39:45 That's a good rule of thumb.

39:46 I feel like I mainly use lambdas for exactly that, that use case and otherwise try to stay

39:51 away from them.

39:52 If you have to line break a lambda, that's a problem.

39:54 Yeah.

39:54 Yeah.

39:54 That's, yeah.

39:55 That's maybe also a good heuristic, right?

39:57 Where, yeah.

39:57 Yeah.

39:58 You could only have, you know, basically you can just put an expression into it.

40:01 So that's the other thing that we haven't even talked about.

40:03 So they're also limited in what you can actually put into a lambda function.

40:06 Right.

40:07 So you can pretty much just have a single expression that would also be the result of which will

40:12 also be returned as the return value of that, of that function.

40:16 And that also limits you, but of course you could use all kinds of ugly work to do something

40:23 that you're not really supposed to do with them.

40:26 Exactly.

40:26 Exactly.

40:27 But you can't have multi-line lambdas in Python, whereas you can in other languages.

40:31 Like for example, C# has lambdas.

40:33 They're basically the same idea, closure and all that, but you can put curly braces and make

40:37 it 20 lines long if you think that's a good idea.

40:40 That's like a great idea.

40:41 JavaScript's kind of like that, right?

40:43 You can like function curly or parenthesis argument and then just curly braces, right?

40:48 So to tell you a secret, I feel like what forced me to understand closures was doing more JavaScript

40:56 development because you cannot avoid them.

40:57 Yeah, closure's all over the place in JavaScript, right?

40:59 Yeah.

40:59 Yeah.

41:00 Yeah, it is for sure.

41:01 And they have like similar ideas.

41:02 They don't call it lambda, but like they have anonymous functions basically.

41:06 Yeah, that's right.

41:07 Yeah.

41:07 All right.

41:08 Are we already at number nine?

41:09 Number nine.

41:10 Number nine.

41:10 There we go.

41:11 Yeah.

41:12 So number nine is about Python coding interviews.

41:15 So the article is called How to Stand Out in a Python Coding Interview by James Timmons.

41:19 And I felt that this is an important topic and it's hopefully also something useful for you,

41:27 dear listener.

41:28 Maybe you have a Python coding interview coming up or you're worried about, you know, when

41:32 the day comes where somebody is going to grill you on your Python skills.

41:35 And we put this article together to cover some common situations there, basically some tips

41:41 that you can use to showcase your deep understanding of the Python programming language.

41:47 Yeah, you've broken into a couple of sections, right?

41:51 You've got like know your built-in functions, know the right data structure, take advantage

41:56 of the standard library, right?

41:57 If somebody says, I want you to use the quick sort, you're like, you know what?

42:01 I created a list.

42:02 Tim sort.

42:02 Yeah, yeah, exactly.

42:04 Or something like that, right?

42:05 Or I think the data structures is super important.

42:08 That's a great giveaway.

42:09 Like I want you to get a bunch of, I don't know, say users and I want you in memory and

42:14 I want you to look them up by ID and I want you to do that quickly, right?

42:18 Like dictionary.

42:18 Yeah, dictionary.

42:19 Does look up quickly happen?

42:20 Is that the question?

42:21 Dictionary.

42:22 Just yell dictionary.

42:25 Dictionary.

42:26 Exactly.

42:27 Or unique or distinct.

42:29 Okay, set, right?

42:30 Yeah.

42:31 Did they say distinct?

42:31 They mean set, right?

42:33 Like just right away, there's, you could have like a complicated 10 line for loop where

42:38 you test, have you seen it before?

42:39 Or set, right?

42:41 Like that's both knowing the built-ins and knowing the right data structures, I think.

42:44 Yeah.

42:44 And it is so much good stuff in the Python standard library or in the core language, you

42:48 know, another great one I think that's worth knowing about is in the collections module,

42:52 the counter class.

42:53 Oh yeah.

42:54 It's if you ever need to count different items or, you know, how often does this string

42:59 or this word occur?

43:00 Right.

43:01 I got a list of text.

43:02 Like a whole bunch of domain names.

43:04 I need to know like how many, each one of them appears.

43:07 Right.

43:07 That sounds like a challenge or it sounds like two lines.

43:09 If you know counter, right?

43:12 Yeah.

43:13 You create a, you import collections, you create a counter, they're most common.

43:16 Right.

43:17 But like these things are incredibly simple when you know them, but if you don't know they

43:22 exist, it's really challenging.

43:24 And I think that's actually a problem from, not a problem, but a, a learning challenge

43:28 kind of going back to your other article.

43:31 I don't remember which number it was, but the one, I think maybe number two about all

43:35 the projects, right?

43:37 Like some of those projects would be really easy if you knew the right libraries.

43:41 But if you thought I have to write this from pure Python from scratch and I've got to implement

43:45 this stuff, right?

43:46 Like, oh, that MP3 player is super hard.

43:48 Like, let me get down to the bytes and look at it.

43:50 Like, no, you pip install like the MP3 library or whatever, like it is that works with that,

43:56 right?

43:56 It's, there's a whole lot of options.

43:58 And I think learning Python is challenging because you learn the language and you think

44:03 you've done it, but you've only like hit the 10%.

44:05 Now you've got to learn the standard library.

44:07 Then you've got to learn everything on awesome Python or PyPI or, right?

44:11 So there's these levels.

44:12 And, you know, but I do think for tests, for interviewing, knowing the foundational stuff

44:17 is most important.

44:18 I agree.

44:19 Yeah.

44:19 And we were thinking, you know, we're going to pick stuff that is actually very likely to

44:23 come up in an interview because in an interview, I think you're not going to get super specific.

44:28 You know, you're not going to talk about the LMHDB or whatever the lightning memory database

44:34 that we talked about earlier.

44:35 That would be, nobody's going to expect, I mean, depending on the kind of role, but if

44:40 it's, if it's data science, they might expect you to know NumPy.

44:43 Right.

44:43 If you've claimed, you know, Python, you better know NumPy at least cursory, right?

44:47 Yeah.

44:47 And if you claim that you, you especially better know about things like the collections module,

44:52 you know, these like core things.

44:53 Yeah.

44:53 Yeah.

44:54 For sure.

44:54 Yeah.

44:55 What about when you get stumped?

44:56 What is your thoughts on like, you know, how do I do this thing?

45:00 Like, you know, inside your thing, screaming, like I have no idea.

45:04 Yeah.

45:04 I start sweating profusely and shivering.

45:07 Go into the fetal position.

45:09 That's why I'm running my own company now.

45:11 Yeah.

45:13 No, that's a tough one.

45:14 I think the advice that I would give is start asking questions because it's oftentimes not

45:20 a good sign if you ask someone a question in an interview setting and they immediately launch

45:24 into writing code or they feel like they're expected to know the answer off the bat.

45:28 A lot of times what the interviewer will want to see is how are you approaching a problem?

45:33 Are you able to get help?

45:34 Are you able to ask intelligent questions?

45:36 And even if you don't know the specifics, I mean, nobody really expects that, right?

45:40 A lot of times if you can use Google, if you can use Stack Overflow, if you can use, you

45:43 know, Talk Python and RealPython and all these sites that are available to you, you would have

45:48 that in your normal working environment.

45:50 You know, like I use Google and Stack Overflow like probably like hundreds of times in a productive

45:55 day.

45:55 I use it shamelessly without guilt or judgment, right?

46:00 I mean, because there's a bunch of stuff that you need to know and then there's a bunch

46:03 of stuff that just doesn't deserve to take up space in your memory, right?

46:08 And you should just be able to go, I'm just going to Google it.

46:11 I don't know what the right way to do this library with that thing is.

46:14 I'm going to Google it.

46:16 But just like actually knowing that it exists and I just don't remember quite how to use

46:19 it, I think is like the big step.

46:21 Like I know I know there's a counter thing and I know I can get it to group by the count.

46:26 I just don't remember how to the steps to make that happen, right?

46:30 Like I think that's okay.

46:31 Yeah, I think that's totally okay.

46:33 So just duck, duck, go it.

46:35 Just bing it.

46:36 Google it.

46:37 Just duck, duck, go it.

46:39 AltaVista it.

46:40 I don't know what else is there.

46:41 Yahoo it.

46:42 Yeah, yeah.

46:42 AltaVista.

46:43 That's a good one.

46:44 I remember that.

46:44 That was good.

46:45 One other thing I would sort of put out there is like a huge turnoff to me if I was

46:50 interviewing, I did that for a while with people.

46:52 If I feel like they are lying to me, they're done.

46:55 I don't care if they seem good.

46:57 If I say like, oh, how would you do that with SQLAlchemy?

47:00 Oh, like I've used so much SQLAlchemy.

47:02 And then you can tell like they've never, ever, ever seen it, right?

47:06 Like they don't even, they can't even describe like, well, what I would do is create a class

47:09 that derives from like another class and it maps to the database.

47:12 Like that's a foreign idea.

47:14 But they're claiming like they've used it in production.

47:17 Like done.

47:18 Not a good strategy.

47:19 Not, I would, I don't know.

47:20 How do you feel?

47:21 Like, would you hire that person?

47:22 Because everything else comes to the question, right?

47:24 I agree.

47:25 It's, it's, yeah.

47:26 It's at that.

47:26 You want to find, find out, would you ask the interviewer?

47:29 I feel like you also want to find out, would you want to have this person on your team?

47:33 Would you want to work with them?

47:34 Right.

47:34 Would I trust them to be?

47:36 Yeah.

47:36 They start making up stuff like, hey, you know, did you review that pull request or request?

47:40 Or did you merge that hot fix?

47:42 Or did you, I don't know, do that?

47:43 And then you feel like you can't really rely on that person and it's not a good start.

47:47 Or we're going to build an e-commerce backend.

47:50 Who's done payment stuff before and feels like they can do it, right?

47:53 And maybe not.

47:54 I don't know.

47:55 Definitely use floats for currency.

47:56 Yeah.

47:58 I don't know if we have that one in the list, but that's, that's also a really common question.

48:02 I feel like where people are like, oh, what data type should you use to represent currency

48:06 in your program?

48:06 Right.

48:07 Right.

48:07 Integers probably.

48:08 Yeah.

48:09 Yeah.

48:09 And then break it down to sense and then use integers.

48:11 Yeah.

48:12 Just round it.

48:13 Just round it.

48:13 Just round it.

48:13 About a dollar.

48:15 Yeah.

48:16 It's all good.

48:19 It's about a dollar.

48:20 All right.

48:21 Well, we're coming up on the, the grand finale here.

48:24 And this is another one that I could, I'm very passionate about.

48:26 I could riff on for a long time.

48:28 So you'll have to stop me at some point, but it has to do with the object oriented programming

48:33 component of Python.

48:35 Yeah.

48:36 So the article is called inheritance and composition, a Python OOP guide by Isaac Rodriguez.

48:42 And I think inheritance and composition, that is the, one of the core pieces of object oriented

48:50 programming.

48:50 And in my experience, it's also the piece that if you're completely new to OOP and you're trying

48:56 to understand, okay, well, how is this helpful?

48:58 Like how does this work?

48:59 It can be a sticking point for some people.

49:01 Yeah.

49:01 So we wanted to do a dedicated article that is, yeah, basically a deep dive on inheritance.

49:05 It sounds a little bit like modeling with objects and just like some practices around

49:10 that.

49:10 Right.

49:11 Yeah.

49:11 And how do you go about like breaking down a hierarchy or like, I guess a domain into a

49:17 hierarchy of objects?

49:18 Yes.

49:18 Yeah, exactly.

49:19 That was getting at.

49:20 And so maybe we should define inheritance and composition.

49:23 I think inheritance is pretty clear.

49:25 Composition might be a little less well known.

49:27 So inheritance is, I want to model like a bunch of cars.

49:31 So I have a basic car or just a car, but then I have a sports car that does sporty things,

49:37 right?

49:37 Maybe it has like paddle shifters or it has like a manual transmission mode that has additional

49:42 functionality.

49:43 So I might say, all right, well, the idea is what we're going to do is we're going to

49:46 create a car and a sports car.

49:48 And then maybe I want to have a track car that can also take slicks.

49:51 Like, so it derives from sports car.

49:53 And the deeper that those get, the more full of the abstractions can break down pretty hard,

50:01 right?

50:01 Like, you know, if you model creatures, I've got a living animal and then I've got a bird

50:07 and then I've got, what do you do with a robot bird, right?

50:11 Does it drive from bird?

50:12 That's a hard one.

50:13 Right.

50:13 Like it, it has bird like things, but the animal eats, robot doesn't eat.

50:17 Right.

50:18 So like if you go too deep, it makes, it's a problem.

50:20 Right.

50:20 So that's inheritance, obviously.

50:22 Composition.

50:23 Tell us about it.

50:24 So composition.

50:24 So if inheritance defines is a relationship.

50:27 So like a sports car is a car and the car is a vehicle and a vehicle is a thing or whatever

50:33 machine.

50:33 Composition defines a, has a relationship.

50:37 So you can say, okay, a car has an engine or a car has a steering wheel.

50:43 Right.

50:43 And it has a transmission.

50:44 Instead of making a sports car, maybe you just make a car with a sporty transmission.

50:49 Right.

50:50 And so the whole thing doesn't have to like, because I don't know, what if you have some

50:55 kind of truck, but it also has like a manual shifting thing, right?

50:58 It could, right.

50:59 You wouldn't have a truck derived from a sports car.

51:01 That would be weird.

51:02 Right.

51:02 But you could easily like interchange the parts and it, it helps really alleviate some

51:07 of those like deep object hierarchies.

51:10 I think.

51:10 Yeah.

51:11 Yeah.

51:11 It's, it's basically another tool in your toolbox there for defining these relationships.

51:15 Because if, if you define everything in terms of a inheritance relationship, then you end

51:19 up with these unmaintainable, like the, you end up on the dark side of OOP.

51:24 That's right.

51:25 And like small changes to like a deep down base class can make absurd things in the end, like

51:32 a robot that has to eat or something like that.

51:34 Cause maybe the animal didn't eat at first and that made sense.

51:36 But now later you realize all the animals have to eat.

51:38 And then like, well, what do you do about the robot thing that we put there?

51:41 Like that's where you use multiple inheritances, which is like a whole dutter of can of worms.

51:46 That's a deep, that's a big can of worms as well for sure.

51:48 But I, I'm a big fan of composition.

51:50 I think, I can't remember where I heard, I'm pretty sure the original gang of four design

51:54 patterns books said prefer composition over inheritance.

51:57 Yeah.

51:59 Like you want shallow hierarchies.

52:00 Yeah.

52:01 Like you're going to like it's objects and inherits aren't inherently bad, but they're

52:05 easy to abuse.

52:06 And so composition is a really way, good way to keep those shallow and interchangeable and

52:11 small.

52:11 So yeah, quite, quite cool.

52:13 I like this one a lot.

52:14 Wow.

52:15 Did we really make it to the, all the way?

52:16 Oh, actually speaking of the gang of four book, I think that might be a recommendation

52:20 here at the end of the article because we, yeah.

52:23 Also always give.

52:24 Yeah.

52:24 So the article comes with recommended reading, right?

52:26 Yeah.

52:27 Yeah.

52:27 It's got some cool design, design patterns.

52:30 head first design patterns, clean code, solid principles, list cove substitution principle,

52:34 all those kinds of things.

52:36 Yeah.

52:36 A lot of these apply.

52:37 It would be remiss of us, I think, to riff so fondly on like an object oriented story in

52:44 Python without seeing that like a lot of what people do with objects and classes and other

52:50 languages is simply unnecessary in Python.

52:53 Right.

52:54 So there is a little bit of pushback and well, I know you did Java and everything had

52:58 to be a class.

52:59 You don't have to build it this way.

53:01 Right.

53:01 Like for example, if you have a variable that you need to be basically a singleton and then

53:07 you want to group a bunch of functions together, you could have a static class that has those

53:11 in there in like Java or C# or something like that.

53:15 But you could also in Python just have a module that has a variable and it has functions.

53:21 And then if you just import that module, you say that module dot the, the fields or the

53:26 variables or the functions, that's the same thing as a static class.

53:29 Right.

53:30 Yeah.

53:30 Right.

53:30 You don't have, and you don't, it saves you a bunch of work and it's, it's more Pythonic.

53:35 Yes.

53:35 I guess.

53:36 Right.

53:36 Then making everything a class.

53:38 Yeah.

53:38 So there, I mean, maybe there's a little bit of, do I really need a class for that?

53:43 Right.

53:43 If you're going to create different ones over there, different values at the same time, like,

53:47 well, probably.

53:47 Right.

53:48 But maybe if you're like just trying to group stuff, maybe the modules, right thing.

53:50 But if you do decide and it does make sense to have a class, this inheritance versus composition

53:56 thing is super important to understand.

53:57 Yeah, absolutely.

53:58 And I don't want to give the impression that like, you know, if you, if you're writing in an object

54:02 oriented programming state style, that that's somehow superior or like the end

54:05 all, you know, of, of coding.

54:07 I don't, I don't think that's, that's actually true.

54:09 I think the, the really powerful thing is understanding these tools, like to have a really

54:13 big toolbox and being able to pick the things that make the most sense.

54:17 Like a lot of times, you know, when, when I'm writing a program in Python or I'm sketching

54:20 something out, I, I'll hardly like write any classes depending on, on the use case.

54:24 Or I found myself, you know, most recently just basically adding like these, like, so I've

54:30 been working on the real Python platform a lot and I've been writing more function-based

54:35 codes or procedural code where maybe my data model is class-based, but then I'll have,

54:41 you know, a module or I don't know, redeeming access codes or coupon codes or something like

54:47 that.

54:47 And it basically defines like a really nice high level interview interface to me.

54:50 These are the five operations you do on coupons or something, right?

54:54 Yeah.

54:54 Yeah.

54:54 And that's all function-based.

54:56 Yeah.

54:56 And then internally they, they use classes to kind of represent the data and, and shuffle

55:01 it around.

55:01 Probably working with Django ORM or something like that.

55:04 Right.

55:04 Yeah.

55:04 Yeah.

55:04 Yeah.

55:04 Instead of cramming that all into a view or actually I prefer, for example, a function-based

55:09 views in Django instead of class-based views because I don't like sort of the getting the

55:12 deeper intendation.

55:13 I would, we could, we could get into all kinds of, disagreements there, but, yeah,

55:20 just, just want to make sure, you know, that, that I get this across that, I don't

55:23 think the OOP coding style is, not the one true way that the one true way that this

55:30 should be one, exactly one way to do things.

55:31 Yeah.

55:32 Yeah.

55:32 But if you're going to do it, like understanding this, this difference between inheritance

55:35 composition, certainly, it certainly makes sense.

55:37 I do a lot of what you're recommending there as well.

55:39 All right.

55:39 Well, that's our top 10 items, Dan.

55:42 Yeah.

55:42 That, that went by super fast.

55:45 Yeah.

55:45 It did go by fast, but I think these all have special value and, you know, people might

55:49 be kicking back.

55:51 A lot of folks have vacation time around this time of year.

55:53 You know, they're also thinking of what's coming in the next year in 2020.

55:57 I mean, first of all, let's just take a moment and say, thank you, Python 2, but goodbye.

56:05 Yeah.

56:05 Bye-bye.

56:05 We'll miss you.

56:07 The death plot is down to single digit days probably at this point.

56:12 Right.

56:12 So that's actually pretty exciting.

56:14 Yeah.

56:14 That's a big change, right?

56:15 Yeah.

56:15 Yeah.

56:16 You're right.

56:16 Yeah.

56:16 Cool.

56:17 All right.

56:17 Well, there's a bunch of articles for people to check out while they're on vacation, got

56:21 some time away from work.

56:22 They don't have to, you know, fill out TPS reports all day.

56:24 Smashed out printer.

56:27 That's right.

56:27 Smashed out printer.

56:28 Awesome.

56:29 All right.

56:29 Well, thanks for being here as always.

56:31 Cool.

56:31 Yeah.

56:31 Thanks for inviting me.

56:32 This is great.

56:33 You're welcome.

56:33 I guess I should ask you the two questions before you go.

56:35 So the two questions are, what editor do you use to write Python code these days?

56:40 So I've started to use Visual Studio Code a lot.

56:43 I use Sublime Text.

56:46 Yeah.

56:46 It's a pretty similar style of editor.

56:49 Very similar.

56:49 Right.

56:50 Yeah.

56:50 What I still love about Sublime is just how fast it is.

56:53 Like there's a noticeable difference in the rendering speed and scrolling around.

56:58 But the Python integration that VS Code has out of the box is really cool.

57:05 It's growing and growing all the things it can do.

57:07 I like it for recording video courses because I can have an integrated shell there.

57:12 I can have a setup that looks really, really nice, I think.

57:14 And so I've been doing that a lot recently.

57:16 And so, yeah.

57:17 Working out of VS Code.

57:19 Yeah.

57:19 Awesome.

57:20 The other question changing for today.

57:22 What's next for RealPython in 2020?

57:25 100 authors?

57:26 Yeah.

57:26 That's a big goal of mine.

57:27 You know, I want to, I would love to have 100 authors published on the site.

57:31 Authors and instructors as a magical number.

57:33 And, you know, maybe we'll crack that 3 million visitors.

57:37 I don't know how many Python developers are out there.

57:39 Well, I suspect after they listen to this episode, it'll probably be 3 million straight up.

57:43 It'll be 10 more.

57:44 For sure.

57:46 It's going to, yeah.

57:47 Awesome.

57:47 Well, best of luck in 2020 and keep up the good work.

57:50 It's a huge resource for everyone.

57:51 Thank you.

57:52 I mean, you know, same to you.

57:53 Like, it's been so cool just becoming friends with you.

57:56 And when we first met, which was, I think, like three years ago.

57:59 Three or four years ago.

58:00 It's quite a while back.

58:01 And just being on this journey here together.

58:03 I really appreciate that.

58:05 Yeah, absolutely.

58:06 Thank you.

58:06 Same to you.

58:06 It's been fun to be on it together.

58:08 Awesome, man.

58:08 All right.

58:09 Well, catch you later.

58:09 Bye.

58:10 Yeah.

58:10 Bye-bye.

58:10 This has been another episode of Talk Python to Me.

58:14 Our guest on this episode was Dan Bader.

58:17 And it's been brought to you by Linode and Brilliant.org.

58:20 Start your next Python project on Linode's state-of-the-art cloud service.

58:24 Just visit talkpython.fm/Linode.

58:27 L-I-N-O-D-E.

58:29 You'll automatically get a $20 credit when you create a new account.

58:32 Brilliant.org encourages you to give the gift of critical thought and knowledge.

58:37 Visit talkpython.fm/brilliant and grab a gift subscription to help your loved ones finish

58:43 their day a little smarter this season.

58:44 Want to level up your Python?

58:47 If you're just getting started, try my Python Jumpstart by Building 10 Apps course.

58:51 Or if you're looking for something more advanced, check out our new async course that digs into

58:57 all the different types of async programming you can do in Python.

59:00 And of course, if you're interested in more than one of these, be sure to check out our

59:04 Everything Bundle.

59:04 It's like a subscription that never expires.

59:06 Be sure to subscribe to the show.

59:08 Open your favorite podcatcher and search for Python.

59:11 We should be right at the top.

59:12 You can also find the iTunes feed at /itunes, the Google Play feed at /play,

59:17 and the direct RSS feed at /rss on talkpython.fm.

59:21 This is your host, Michael Kennedy.

59:23 Thanks so much for listening.

59:25 I really appreciate it.

59:26 Now get out there and write some Python code.

59:27 I'll see you next time.

Talk Python's Mastodon Michael Kennedy's Mastodon