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.
This is Talk Python to Me, episode 244, recorded November 8th, 2019.
Welcome to Talk Python to Me, a weekly podcast on Python, the language, the libraries, the
ecosystem, and the personalities. This is your host, Michael Kennedy. Follow me on Twitter where
I'm at mkennedy. Keep up with the show and listen to past episodes at talkpython.fm,
and follow the show on Twitter via at talkpython. This episode is sponsored by
linodeandbrilliant.org. Please check out what they're offering during their segments. It really
helps support the show. Hey there. I want to take just a moment before we get to the interview
and say thank you. It's the end of 2019. Looking back, it's been a great year for the podcast and
all the other stuff we're doing, like our courses, and it's been really humbling to get messages from
all of you about how the podcast is helping you in some way or the benefits you're getting from it.
And I just want to say thank you for listening because it's a true honor to be able to create
this podcast for you. It's a lot of work, but it's entirely worth it. It's really, really great,
and it couldn't be done without you listening and sharing it. So thank you, thank you, thank you.
Hope your 2019 was great as well. Now let's chat with Dan.
Dan, welcome back to Talk Python to Me.
Hey, it's great to be back, man.
It's great to have you back. It's been a while since you've been on Talk Python, but
not too long ago since you were on Python Bytes. That was fun.
Yeah, that's right. We practically just finished recording that. And yeah, it was great with
Cecil Phillips and yeah, I had some good links that week, I think.
Yeah, absolutely. So I'm pretty excited about 2019. It was a good year. How was it for you?
It was a very, very busy year, I would say.
Yeah, I feel like for you guys, like RealPython has come along a long ways. You've got a lot of
authors, you've kind of got this process going, you've got your editorial, your editing, and
overseeing how the content creation is going. And you're making a big difference, I think.
Thanks. That's good to hear. And yeah, it's just been this incredible year. We're at 75 authors and
video instructors published on the site now. So I want to get to 100 next year. That would be a nice,
cool achievement, I think. And we also just recently hit 2 million visitors, like unique visitors or
readers in a single month, which is kind of this incredible... Let me... I can almost... It totally
sounds like I'm super bragging here, but I literally can't wrap my brain around that. It's just kind of
nuts and really cool just to see that growth and how it's resonating and how we're getting really,
really positive feedback. Yeah.
Yeah. I think that's really positive and congratulations.
Thank you.
Yeah. And I think it speaks one to all the work that you're doing that you talked about. It also speaks
to just Python's growth in general, right? Like you're riding two curves and they're both going
in the right direction.
Yeah, that's true. So how was your 2019?
My 2019 was amazing. Didn't skip a single episode on any of the podcasts. And I think that's a pretty big
accomplishment actually.
That's huge. Yeah.
Yeah. And released a bunch of classes. I feel like we've covered some important stories
on the podcast, right? That's one of the things I try to do. We can cover every web framework
and the person who creates it and that's great and so on. But I really want to highlight that
Python is not just for web developers or like straight down the middle of the road data scientists.
Yeah.
We've had medieval Islamic philosophers and we've had people doing machine learning for particle
collisions and all sorts of stuff that might have been back in 2018. But those kinds of stories are really
interesting. I think we had a decent amount of those and I'm really happy to be able to share
those edge stories that I think are so interesting.
Yeah. Yeah. I think that's super cool. And then I think a podcast is just such a great format for it as well,
where somebody can come on the show and join you there and really give the listener a chance to
understand why this is cool and what the motivation. That's always the most interesting thing for me
when I listen to your show, figuring out like, okay, why is your guest doing that? Why are they so into
researching Islamic philosophy with Python, which are two topics that I would have never imagined
you would combine in some way. And then I listened to the show and I'm like, oh man, it's so cool how
broad this is, what people are doing with Python.
Yeah. You listen to the story and it makes perfect sense. You're like, of course you should be doing
that. And the thing I like about those types of stories is there's a lot of people that think,
oh, I'm not a programmer or it doesn't make sense for me to do that or whatever. Like,
I'm just a stock trader. I'm just a biologist. And then you hear that and you're like, all right,
if somebody can use it for philosophy, thousand year old scrolls, I should be able to find a way to
make use of this in my much more mainstream type of job. Right. It's like, yeah, obviously there's all
these amazing things people can do. They just got to be a little creative to do it.
Yeah. Yeah, absolutely. I feel like we talked about this before, but this whole idea of the dark
matter developer, someone who doesn't actually really identify as a developer or programmer,
but there's so many people out there who are practically programmers or they're working with
code, they're writing code, but they don't really see it that way.
A big enough part of the community to actually come along and come to the conferences or blog about
programming. They're probably blogging about something else that they care about. Something
like that, right?
Yeah. Yeah.
Yeah. Sweet.
Cool. Well, let's talk about what we're going to focus on for this show. So the idea is we're going
to take 10 of your popular bookicles, book articles, your articles-
That should be a new one.
Yeah.
So we're going to take our near book style on real Python and just pick 10 of them. We're going to
call it the top 10, but it's not necessarily top 10 by your traffic. It's kind of the ones you wanted
to highlight from the year, right?
Yeah. So yeah, I really wanted to give a chance to sample a wider variety of topics because if you go
purely by traffic numbers, things are just going to get overshadowed by popular terms that people
search for on Google.
Look, it's for Django articles or whatever, right? And just because people are searching for that or
whatever.
Yeah. And so, yeah. So we kind of assembled a list of 10 articles that we wanted to highlight and then
go over and then share with you.
All right. Where are we starting?
Sweet. So we're starting with an article that's called How to Run Your Python Scripts by
Leo Danis Pozo Ramos. And it kind of sounds simple, right? You just go-
Right. Don't you just say python space script.py?
Yeah. I mean, that's what we do most of the time, right?
Some of the time, yeah.
Hit control R or something like that. F5. And this article is cool because it, of course,
talks about that. But then it goes really, really deep into the behind the scenes and
what some of the other ways are that you can possibly use to run Python code. So you could
just load the string from Office Script and then just eval it. Or there's the import lib module
in Python 3 that you could use. And there's all kinds of other more complex methods where you get
deeper and deeper into CPython.
You could do python space dash C and like some code, right?
You could also do that if you wanted to run a code snippet from the command line. And I just love this
article because it starts with the really simple and straightforward and like main use case. And then
it goes deeper and deeper and deeper into all the different alternatives. And you know, what the
difference is between running a module with Python dash M versus actually just running it by Python
space from the command, Python space and then the file of the file name and running it from the
command line. And yeah, for that reason, you know, I wanted to highlight that article.
Okay. Yeah, that's really cool. And one of the things I like about a couple of the articles that
we're covering are I look at the title and I go, yeah, I know that. And then I look at the article
and it's like, I don't know how many words, but it's like, you know, readability suggests this might
be an over an hour to read this article. I'm like, wait, I thought I just, that was simple and I knew it.
And you know, when you, whenever I, that kind of makes me think, I'm like, oh, I actually might learn
something here. If I just pay attention, like this is going deeper or into a different area than,
because if I thought it was that simple and it's this, then it's clearly I'm missing something.
Yeah. As the kind of the person running the site and working on the platform there, like I love
seeing surprises like that because it's always a team of us that's working on the article. So we
have like multiple review stages and we review the outline and then we review the script and there's
like a technical review and just seeing these things kind of grow and you'll become a real Python
article is, I just really enjoy that process and being a part of it. So yeah, this is like a great
example, I think, of that. Yeah. Yeah. Quite cool. So covers a bunch of stuff and probably something,
you know, there's definitely a few suggestions in there that I didn't know. All right. What's number
two? And number two is called 13 Project Ideas for Intermediate Python Developers by Habib
Shopeyou. And this was born out of a lot of questions that we received over email or Twitter and
also most recently in our real Python community Slack where people were asking, like, I feel like
I kind of know how to use Python, but I don't know what I should build. I've learned the language. I know
loops. I know how to do strings. I create a dictionary, get stuff in and out of it. But what can I actually
build that like is the next step? Exactly.
Yeah. Because that's often very challenging. It's not just challenging on like maybe a lack
of creativity. It's challenging in like, oh, you want to be cool to build Instagram? Like, no,
it wouldn't be cool to build. It'd be very hard to build. It's like millions of lines of code.
You know what would be cool to build? As a timer, like, no, it's boring and it's too short. Like,
what is the right size where it's challenging, but I can reasonably expect to do it if I put in some
effort? Yeah. And that's a really hard one, right? Like I was back in the day when I learned how to
code or first started. I mean, I guess you never really stopped learning how to program.
I was in these like game development forums and there was every single week there was like
a new person joining and they were like, I want to build this MMORPG or like, I want to build this
like massive thing. And so everybody was working on these like massive projects that never really
went anywhere. And I think that could be really, really frustrating. And so my answer to that question,
you know, what should I build as an intermediate developer was usually like, just pick whatever,
you know, just take a command line app that you use and try to emulate, like try to write your own
version of it. But the problem is that doesn't really work for some learners, for some students.
And so we wanted to give them a list with ideas, you know, here's some things that we think you could
probably pull off. You have a fighting chance of actually like building this app, right? And it's
not going to be a world of Warcraft, but it's going to be a cool like alarm tool or a little file
manager or a little note-taking application. Yeah. Give us a sense of some of the ideas you got there.
Yeah. So the ones that I just mentioned.
Yeah, exactly. So MP3 player, URL shortener, file rename. Yeah. That's really nice.
Contact book, I think is also something interesting where, you know, there's different ways you could
store the data could just be like a little, yeah, like an address book where maybe you ask, you know,
it could be as simple as just storing a dictionary to a text file, or then you could get progressively
more interesting there and have a little database maybe.
You could use SQLite and then you could start using SQLAlchemy because, you know, you don't
want to be writing inline SQL and then, you know, become little Bobby tables.
Yeah, that's right. Well, you know, someone could take you a great free MongoDB course.
Yeah, exactly. Yeah. They could do a MongoDB back one.
All kinds of options there.
Yeah. They could totally like level these up. They could put them online, all kinds of cool
stuff. Yeah. So I like it. And you got it broken down to web, GUI and command line. That's pretty
good break.
Yeah, that's right. Yeah. We try to give like a high level overview and then depending on what
you're interested in, you could pick the right project for you.
Yeah. Super. All right. What's next?
All right. So I think we are at article number three. And what I wanted to highlight there is
the article is called Three Ways of Storing and Accessing Lots of Images in Python by Rebecca Stone.
And I think this article is cool because, again, it's something that I never really thought about
before. You know, I was like, OK, you know, my Django app uses a bunch of static images.
There's just a folder in there.
Right, right. That's slash static slash IMG or something, right?
Yeah. But what if that maybe doesn't work so great anymore? I think you're storing a
massive amount of images. You know, you have some, I don't know, some robot, some probe that's going
to Mars and you have lots, you have like terabytes of images. And where are you going to store them?
How are you going to make this manageable?
Right. Are you going to create some kind of like automated IoT doorbell that always snapshots,
whatever's close, right?
Yeah. And if your house gets broken in a lot, eventually you have too many images and you got
to figure out what to do with them.
That's right. Why are all these people at my house? You're killing my storage.
All right. So what are some of the suggestions?
Yeah. So it goes, the article goes into three techniques there. So the first one is, you know,
just like store them on disk as .png files or, you know, JPEG or what have you. And then the
second option is using a memory mapped database called LMDB. And the third option is using a
hierarchical hierarchical data format like HDF5. And the latter two, I'd never really heard about before.
But it turns out, of course, that there is a lot of Python tooling available for these things.
And so they provide a number of interesting features. So for example, there's a compression
that you could use. So to potentially limit your disk usage. And there's just lots of good tooling,
if that's a problem that you're facing, that people can use with Python.
Yeah, this is interesting. Like I'd never heard of LMDB, but apparently it's lightning memory mapped
databases, which sounds fascinating.
It sounds, yeah. It's like, I should definitely check that out. Find a use case for that. Cause that
sounds cool.
Yeah. You got to build that, that magical doorbell robot.
Right. Maybe selfies for robots or something. They just do it all day long. All right. Awesome.
All right. So what's number four?
Number four is called Speed Up Your Python Program with Concurrency by Jim Anderson.
Oh, this is one that definitely, definitely resonates with me.
It's, yeah, you have a lot of great material on asyncio and working with parallelism and concurrency
with Python. And the idea for this article was to give the reader an overview of what different
types of concurrency that are out there. And what does it mean if a program is CPU bound versus IO bound
and which options make sense using, you know, when should you use threading versus a multi-processing
or asyncio. And we also added an interactive quiz to it. So that, you know, if you're reading this,
you can really make sure, okay, I actually understood these concepts because they're pretty
difficult to take in the first time.
Yeah. That's the kind of thing that just needs to wash over you several times until you're like,
all right, I'm starting, I'm starting to get the feel of this thing.
Yeah. Get burned by it a couple of times and you're like, oh no, I got to re-architect this again.
Exactly. And I think this is important in Python because I think Python's concurrency story
is both amazing, but non-obvious in some ways. And what I mean by that is a lot of programming
languages, you can leverage computational concurrency by using just threads, right? Because I got, you
know, this thing believes it has 12 threads in my MacBook here. It has six hyper-threaded cores,
right? So if I were to like write a single-threaded program, it'll get like eight or 9% CPU usage
and that's it. So if I want to make that go faster on a lot of languages, C++, C#, whatever,
I can just create a bunch of threads and it can start running on all of those different threads.
But in Python, we have the gill, so it doesn't work, right? And that's, I think, actually caused a lot
of challenges because people say, well, that means Python's concurrency is broken. It's not broken.
It just needs a clearer mental model of when to apply each technique.
Yeah. It's kind of like a manual gear shift, right?
Yeah. Yeah.
It's not broken, but the car is also not going to go.
It drives in the day, but it won't drive at night. Put it in night mode. It won't go.
Put it in N.
Yeah, exactly. So for example, if it's IO bound, probably what you want to do is something
to do with asyncio, right? But if it's computational, you really need to do, at least for the moment,
something with multiprocessing.
Yeah.
And so it compares those types of things, huh?
Yeah, exactly. And like I said, you know, we have this quiz at the end that you can take
and then really make sure, okay, I understand what the differences are between these concurrency
models.
This portion of Talk Python to Me is brought to you by Linode. Whether you're working on a personal
project or managing your enterprise's infrastructure, Linode has the pricing, support, and scale that you
need to take your project to the next level. With 11 data centers worldwide, including their newest
data center in Sydney, Australia, enterprise-grade hardware, S3-compatible storage, and the next-generation
network, Linode delivers the performance that you expect at a price that you don't.
Get started on Linode today with a $20 credit and you get access to native SSD storage, a 40-gigabit
network, industry-leading processors, their revamped cloud manager at cloud.linode.com,
root access to your server, along with their newest API and a Python CLI. Just visit talkpython.fm
slash Linode when creating a new Linode account and you'll automatically get $20 credit for your
next project. Oh, and one last thing. They're hiring. Go to linode.com slash careers to find
out more. Let them know that we sent you.
Number five.
All right. Number five. Build a recommendation engine with collaborative filtering by Abinaf
Aitzeria. And what do you think this is?
I'm reading a real Python article and it says, you might also like these other three or something
like that or talk Python course. You might also like this one, right? It's a good follow-on
for various reasons, right? People who took this course usually took that one next or people who
read this article also like shared that other article or something.
Yeah, exactly. It's about building a recommender or recommendation engines like you would have on,
you know, pretty much any larger website like Netflix or Amazon. They're all recommending you
products or movies that you might enjoy based on what you already watched. And a lot of times what
they do is they look at, kind of build a profile of the things that you watched and then kind of
finding similar users, other users on the platform that watched those movies and enjoyed them. And
then based on that, trying to figure out, okay, what did these other people also watch and enjoy?
And maybe we can recommend that back to you and then hopefully you'll have a good time on the
platform.
Yeah, that sounds really cool. It sounds like very relevant to data scientists and there's probably
a lot of data science algorithms in there, huh?
Yeah, absolutely. I think there's some cool stuff happening there and there's some matrix math.
What I like about this article that I really like how it turned out from like a typesetting
perspective. So that was like a really big aspect of kind of building the new real Python
CMS and hosting platform and built on Python 3, Django 2 and all the good things. It was a lot of fun
building it and working on it. And I mean, I'm still working on it. And I think this is just a cool
showcase for that also, you know, where you get some graphs in there, you get some interactive,
or you get some code snippets that you can copy and paste and you get some math typesetting there.
And I think that makes it very engaging to the reader as well. And yeah, and it's just a cool
topic. Like I'm just fascinated by those things, you know, how you can use the wisdom of crowds or
whatever that way. You know, you could say like, well, we have enough people using the platform,
you have enough people watching Netflix. And then all of a sudden I can get these amazing
recommendations for other things I would have never thought about watching.
Yeah. You help it make it better for other people without even knowing it, right?
Yeah.
Your actions are there and used for good. Yeah. So it talks about things like K nearest neighbors
and probably the fundamental algorithm there that's being used, right?
Yeah. I believe it's for this particular recommendation system technique called collaborative
filtering. But there's also other approaches that I can't really speak intelligently about.
Yeah, sure. There's even some cool recommendations like the surprise recommender system, which is a
Python scikit-learn extension, right? So you can install scikit-surprise.
It's a cool name for recommender system.
That's a great recommender, right? Like surprise, we actually can recommend something useful. This is
not like wasted space here. Yeah.
Cool. Yeah. So if people are interested, they can check that out. And also I noticed it's kind of
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
Anaconda, here's how you use that as well, right? So this one seems like there'd be a lot of folks
using Anaconda as their Python distribution to work on this.
Yeah. I think if in the data science space, Conda seems to be quite popular. And so typically we kind
of standardize like for the articles, we standardize on just using pip because that's kind of the lowest
common denominator. Yeah.
But in this case, you know, we felt like it makes sense to be closer to where the target audience might
be there. Right, right. Take it to the data scientists, right?
Yeah.
That's really cool. So I love it. It's a good one.
Number six on our list here.
Right. So this one might be a bit surprising, but it is called Your Guide to the Python Print
Function.
And this is the one that I was talking about when I thought like, okay, I'd know this thing.
Yeah.
Like, wait a minute, maybe I don't know this thing.
So this is more like a book about the Python print function by Bartosz Zaszinski. And this is just this
incredible deep dive into the print function slash print statement in Python 2. Because again, you know,
would think, okay, maybe this is maybe a paragraph or two about what you can do with the print function.
You know, you can pass some arguments to it.
It requires parentheses now. It didn't used to.
Exactly. Right. Like what else is there to say? And then it goes really, really deep into the
history of the print function and some common use cases that maybe you might not associate with the
print function directly upon first glance. You know, for example, well, how can you build a cool
console user interface? How can you do colors in the terminal? And how can you pretty print if you
have a nested data structure, like some JSON that you parsed into dictionary? How can you make sure
it actually looks good when you print it out to the console or some debug window? And so it's not
just purely about the print function, but all the kinds of different best practices and ways you can
make printing better in your Python programs.
Yeah, that's cool. No one wants to try to use a minified dictionary for debugging.
Nope. That's very annoying. I usually take those and then paste them into the black online
format. I get like a nicer representation. Yeah. Yeah. Yeah. So we cover some of the things I
think are actually not super obvious to new folks coming from the language, right? Like
that's right. If you come from other languages, you might not know that you can actually use a
keyword argument to set the end to be instead of a backslash end to be like a comma and print on one
line with a bunch of commas or something like that or the buffering, right? If I'm trying to do
something computational and print out as the computation is happening, a lot of times that
can get buffered up and then it like all shoots out at once. Or, you know, like if you're like
delaying waiting on something, you want to actually see all the output. Like there's a bunch of little
tips like that in there, right? Yeah. Yeah. And like with everything, it's there's a deep rabbit hole.
Yeah. Down the rabbit hole you go, right? Yeah. I love this kind of article where you think, okay,
we're going to scratch the surface here a little bit and then we're done. And then there's all kinds
of interesting other things you could do or just learn why certain things work the way they do. You
know, ANSI or ANSI escape sequences for making the making colors in the terminal. When you read about
them, they kind of looks like this incredibly confusing format. And then you learn a bit more
about the history and you know how it relates to the sort of these old school terminals of the old
like mainframe computers and how, you know, it's just a format that has grown over decades. And
well, sure, we could all, you know, throw it away and maybe engineer something from scratch. But it's kind
of cool to understand, you know, if I'm, if I, I don't know, you know, boot up my Windows computer or
MacBook in, in 2020, why it's still supporting that stuff and how it goes back, you know, 50 years.
Yeah. Well, another thing that I think makes a night and day difference for these simple little
command line apps is color. More of those should use color, right? If you're saying in the help output,
it would be great to show the required arguments is like one color and the optional ones is another.
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
cross platform or whatever, then you won't.
Yeah. Yeah. Oh, speaking of color there in the terminal, one of my favorite tools is the B Python
REPL.
B Python?
B Python. So the letter B, and then Python, one word. It's a Python interpreter, like a Python, not an
interpreter, but a REPL environment. That is just like the when you start Python from a command line,
you get your little prompt and you can type a Python code into it and run it. But it does
syntax highlighting. So it'll give you beautiful colors in the terminal.
Nice.
And it also does autocomplete, which is kind of cool.
So we use that all the time in our video courses and examples. And people always ask like,
oh, what's that? What's that tool? I want to use that too. And it's great. Like,
like the color really adds a lot of value.
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
PT Python. Are you familiar with that?
Oh, that's great too. Yep.
Yeah. It's like Emacs in the REPL kind of. Yeah. It takes me back to my Emacs days. So last thing,
like we go on and on about this, like incredibly for a really long time about printing. But there's
one thing that's in here. I think that's, that's pretty interesting that they talk about that I guess
also surprised me. I didn't really think about it is mocking the print function for unit tests.
Yeah. That's a kind of a surprise, right? But it's, it's actually a pretty annoying problem. If you,
if you want to write tests for a program where in the test, you actually want to make sure it's
printing the right stuff. Well, how do you do it? You know, how can you actually redirect that output
into some kind of buffer so you can inspect it and say, okay, we got the output that we wanted.
I called this and it said, enter this or whatever, right? Like the prompt that we were expecting or
something. Yeah. Yeah. Yeah. Yeah. Pretty cool. All right. Well, let's move on because it is the
print function, but it is actually really, really interesting. And what are we up to number?
I am trying to check. I think number seven, this is number seven. Yes. Number seven. Yeah. And it
goes right along to number eight in a sense. So how to write beautiful Python code with PEP 8.
Yeah. So this is a cool article by Jasmine Feiner and it's about the PEP 8 style guide and sort of
a beginner friendly intro to PEP 8, why it exists, how it can help you format your code in a way that
other Python developers will expect and appreciate. And I think it's, it's a really good one because,
you know, it breaks it. Like if, when you read the actual PEP 8 can be feedback that I heard in the
past, it's just very, very overwhelming to take it all in and take all the examples in. So we try to
break it down and give you a good overview and then point you to the original PEP so you can do the deep
dive. Yeah. It's really cool. And you know, it's one of those things that's really important that,
so you look like you belong, right? If you start doing stuff that is, you know, Java style or C#
style and someone says, yeah, I'm interviewing for a Python job. And here, let me write a little
code for you and you start using like camel case method names or something like that. You're like,
not so sure you're a Python developer. You don't look like you're from around here, right?
Yeah. First impressions matter, I guess.
Yeah. And you know, once you know the conventions, some of those conventions have meaning,
right? Like the underscore has a certain meaning and things like that. And so it's not implicitly
obvious from that thing that what the meaning is. But once you study it, then you get to know,
right?
Yeah. Yeah. I'm actually, I wanted to ask you what's, is your talk Python, is the code for the
talk Python platform? Is it PEP 8 compliant?
Is it PEP 8 compliant?
It's both for the platform it is, I would say PEP 8 compliant. And I try to do that in the courses.
Probably the way I do that most is just running, like working on everything in PyCharm and PyCharm
will highlight stuff and make it obviously, it'll like, as you type a highlight, it'll go, no,
no, no, no. There's something clearly wrong. Like you don't have an underscore, you have camel case
on a variable name. Stop doing that. Right. And so, yeah, I don't run anything like black across
the whole thing. The only thing I've run entirely across the whole code base, not across the courses
because it's recorded. So it'd be weird to change it. But in terms of the platform, I've used Flint.
Are you familiar with Flint?
I feel like I heard about it. Is this another auto format?
It has, it's a very special tool, but I love it. What it does is it will take all the various string
formatting styles of working with strings. So percent, value value, or the format, something
or other, and so on. And it turns on all the f-strings.
Oh, that's cool.
Yeah. It'll just rewrite your code, like rewrite all your f-strings.
I know a certain core Python developer who would love that. Marietta.
She does all these awesome stickers.
Yeah, yeah. Yes, man. Yeah. So I ran it. In the early days, it had a couple of bugs when you were doing
numerical formatting, like this number, comma, colon, comma, like 0.2F. Like that would get freaked out.
But yeah, like after a couple of iterations, it's really quite good.
Oh, that's cool. I think, yeah, I got to run that. That's great.
Yeah. So I just ran it against like 20,000 lines of code across the training site and the Talk Python
and Python Bytes websites. And I think there was like maybe one mistake. So I just,
I looked at the diff before I checked them all in and just said, actually this, you know,
one out of a thousand, there's this mistake. But yeah, yeah.
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.
Yeah. And I think with this stuff, I feel like we've got to be clear, like it can often be ambiguous,
right? Like any, any sort of code style guide, like PEP 8 or what have you, you know,
in other languages, it's usually not at the end of the day, like naming is a big part of a
developer's job, I think, you know, and in picking names that are
actually communicating the intent well and other people can understand.
And so it's, it's, it's not going to solve that problem because, well, even though if,
you know, if you're following PEP 8 to a T and you're using all the upper and lowercase letters
in the, in the right way, and your naming isn't, just doesn't make sense, then that's also not
going to be great. So it's, yeah, another example might be struggle.
Yeah. You're doing a list comprehension and it's all on one line, right? It's got the,
you know, and for N and such and such, if N such and such. And it happens to be 79 line characters
long. So it's on column 79. It's fine. You don't need to wrap it, but it's like super hard to
understand. It would make sense to have that three lines, the select value, the loop, the,
the collection is going through and the, the test, right? It would be much better. But PEP 8 doesn't say,
well, if it's 79 lines and complicated, it should be broken up. But 80 lines is, you know,
like the hard limit and things like that, right? Yeah. Yeah. And so we've got to think beyond it.
Are you following the 79 characters limit in your code basis?
Do I follow? Sometimes. There's a few times where I don't like, so if I have a, a raw string or
multi-line, not raw string, a multi-line string where you do triple quote, then like there's a bunch of
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
be in the string is more than, or 80 columns, but he would still complain to me like, oh no,
this line is 120. I'm like, yeah, but you show me how to fix it and we'll have a conversation,
but I can't fix this, right? Yeah. Without completely going, you know what, we're going to have a string
concatenation like to nobody's end rather than this multi-line string. So there's a few edge cases,
but I try to. Yeah, me too. Like ever since I started using black, you're like, black's going to change
it anyway. I think you can tell it like to use a different line length limit. Like I feel like that's,
that's always something that comes up where it's like a kind of controversial topic where should
you follow the 79 character limit is even another, there's like a 72 character limit recommendation
for doc strings. Like I try to follow that as well. I have like my, you know, these like a little,
little gutter margin set up in the editor. So yeah, exactly. That's cool. But then at the,
sometimes I'm thinking, okay, but wouldn't it be nice just to go a hundred characters or longer?
So I think, I think like whatever number of people pick, as long as you're consistent,
it's, it's probably a good thing. Yeah. It's somewhat contextual.
This portion of Talk Python To Me is brought to you by Brilliant.org. Let me knock something off
your holiday to-do list. Gifts. Spread the love to your loved ones by gifting them Brilliant.
This really excites me because it's such a fun way to nurture curiosity, build confidence,
and develop problem-solving skills crucial to school, job interviews, or to their career.
Brilliant's thought-provoking content breaks up the complexities into bite-sized,
understandable chunks that will lead them from curiosity to mastery. Go to talkpython.fm
slash brilliant and grab a gift subscription to help your loved ones finish their day a little
smarter this season. That's talkpython.fm/brilliant, or just click the link in the show notes.
We talked about Pep 8. Now how about Article 8? Article 8 is about the Python Lambda function. So it's called
How to Use Python Lambda Functions by Andre Bourgo. And yeah, I wanted to highlight this one because
Lambdas and Python are a topic that can be challenging. I think it's something that a lot of times you don't
really have to, you don't really work with. And so you don't get a lot of experience working with it.
And then when there might be a situation where it's actually useful, for example, if you want to
sort a list or something sorted by a custom key, then if you don't know about Lambdas,
it's going to be a frustrating experience.
Right, right. Like I got to write this other function and that's kind of weird. But yeah,
so they're one of the things that when you learn them, you're like, man, that is cool. I can't
believe I can think of immediately 10 places I would use this, but they're not obvious that they exist
or that you could use them until you see them, right?
Yeah, that's right. And it's, what's the quote there? Like the dose makes the poison or what?
I only know the German version.
Yeah.
Die Dose macht das Gift.
Yeah.
So the dose makes the poison.
Yeah. Basically you don't want to, you want to apply it. It's like salt, you know, you don't
want to overdo it with the salt because then the food's going to taste it.
Yeah. Yeah. A pinch will do you. Absolutely. So yeah, that sounds about right.
Yeah. And so, so this article goes into some use cases and also into the kind of the language
history or why are these types of functions called lambda functions and how does this relate to this
thing called lambda calculus that was invented in the 1930s. And we go back into some of the computer
science stuff.
Yeah, that's cool.
So you can also learn about that.
You know, another thing that I think is interesting that gets very little attention,
I suspect this is happening to a non-trivial number of people and they don't even know is closure.
Right? So closure is the idea that like I have a variable that's either available in the local
method or it's a global variable. Most likely it's like a local variable on that method.
We're using the lambda and you say it in the function body, the lambda body, but not as an argument.
Right. It's somehow magically.
Kind of capturing that.
Yes.
I find this so hard to explain just in audio only because when you see it with an example,
like in the article, it's to me at least a lot easier to wrap my head around it.
But yeah, let's give it a shot.
Like can we.
Yeah. Well, some really interesting stuff happens with closure, right?
It's not just that the variable is like passed, but it's remembered.
It's remembered across function calls.
So even if you change it and then you call the lambda again, it will work with not the
original value like a compi, but it'll work with a changed value.
Which can really bite you also if you're referring to a mutable object and you think you've kind
of captured the full state of this object and then it gets changed under you.
which I think this is also kind of maybe the danger of using lambda is that if you don't
understand how closures work or when that effect kicks in, that you might be writing code that
actually breaks under unexpected circumstances.
Yeah.
And it can be incredibly hard to understand why if you have no idea that this is happening.
On the flip side, you can use it for great power as well.
Like let's just go to like something super simple.
I want to sort a list.
I want to say key equals lambda of item, colon, do something with the item, right?
But maybe there's other variables or other data that's in the function that you want to use to
decide how you sort.
Like if it's below this cutoff, I want it first.
But if it's after this cutoff or like, you know, it's somehow you've got to compute with some other
data that's not purely just the item.
Like if you wanted to sort, you had an address book with, I don't know, name and year of birth
and you wanted to sort it by some calculated value.
Yeah.
So like both of them.
Right, right.
So if they don't have a date of birth, you could have like, here's the default date of
birth we're going to use.
Right, yeah.
Right, right.
Substitute something.
Yeah, they're all going to be born in 1970 or something.
Who knows?
So you could like have that as a local variable, but then include that in your sort lambda.
But the function that's getting called, it only takes the item and the list doesn't know
about your need of this other variable.
It's not going to pass it in, but you can just use closure to just capture it and just like
bring in more arguments into your lambda than would otherwise be available.
And that's a super powerful thing you can do.
Yeah.
I think that probably the main use case, what I personally use them for, there's also
a section in the article that talks about whether lambdas are, we can consider them pythonic
or not.
Because in PEP 8, which we just talked about, there's actually a recommendation there that
says you should always use a def statement.
So define a proper function instead of an assignment statement that binds a lambda expression directly
to an identifier.
And so this is like a strong discouragement to using lambdas.
I think mainly when you actually, you want a named function.
I think anytime you actually want a named function, you should probably not use a lambda.
But if it's like a one-off thing, that's where I would use it.
Yeah.
You even talk about in your article a little bit, like anonymous functions, meaning they
have no name.
You're passing them somewhere.
You're modifying the behavior like of the sort or whatever, but you're not naming the
thing doing that.
Yeah.
That's right.
And with great power comes great responsibility.
That's right.
I think one of the key essence of the lambda, like decide, should I make a separate function
or should I make a lambda function?
I think one of the key differences here, or the key decision, at least for me, is, is it
going to be clearer to just plunk the implementation right here than to give it a good name and put
it somewhere else?
So if it made a lot of sense to give it a good name and put it over there, because it's kind
of complicated, but the name tells you what it does and then use that as the sort, great,
do that.
But if it's like, I'm going to sort just by like sort of list of customers, it's just
lambda of C colon goes to C dot name.
Okay.
Like it would be more confusing to move that away because then you have to be sure like
sort by name.
You're like, oh, wait a minute.
Descending or ascending?
Well, it used to, they renamed it to say sort by name ascending, but then they actually changed
implementation to descending, but they forgot to rename it because they're afraid to break
the code.
And just like, there's all sorts of weird stuff if you move it away.
So if it's clearer to have it like in line than lambda, otherwise not lambda.
That's my test.
That's a good rule of thumb.
I feel like I mainly use lambdas for exactly that, that use case and otherwise try to stay
away from them.
If you have to line break a lambda, that's a problem.
Yeah.
That's, yeah.
That's maybe also a good heuristic, right?
Where, yeah.
Yeah.
You could only have, you know, basically you can just put an expression into it.
So that's the other thing that we haven't even talked about.
So they're also limited in what you can actually put into a lambda function.
Right.
So you can pretty much just have a single expression that would also be the result of which will
also be returned as the return value of that, of that function.
And that also limits you, but of course you could use all kinds of ugly work to do something
that you're not really supposed to do with them.
Exactly.
But you can't have multi-line lambdas in Python, whereas you can in other languages.
Like for example, C# has lambdas.
They're basically the same idea, closure and all that, but you can put curly braces and make
it 20 lines long if you think that's a good idea.
That's like a great idea.
JavaScript's kind of like that, right?
You can like function curly or parenthesis argument and then just curly braces, right?
So to tell you a secret, I feel like what forced me to understand closures was doing more JavaScript
development because you cannot avoid them.
Yeah, closure's all over the place in JavaScript, right?
Yeah.
Yeah, it is for sure.
And they have like similar ideas.
They don't call it lambda, but like they have anonymous functions basically.
Yeah, that's right.
Yeah.
All right.
Are we already at number nine?
Number nine.
There we go.
Yeah.
So number nine is about Python coding interviews.
So the article is called How to Stand Out in a Python Coding Interview by James Timmons.
And I felt that this is an important topic and it's hopefully also something useful for you,
dear listener.
Maybe you have a Python coding interview coming up or you're worried about, you know, when
the day comes where somebody is going to grill you on your Python skills.
And we put this article together to cover some common situations there, basically some tips
that you can use to showcase your deep understanding of the Python programming language.
Yeah, you've broken into a couple of sections, right?
You've got like know your built-in functions, know the right data structure, take advantage
of the standard library, right?
If somebody says, I want you to use the quick sort, you're like, you know what?
I created a list.
Tim sort.
Yeah, yeah, exactly.
Or something like that, right?
Or I think the data structures is super important.
That's a great giveaway.
Like I want you to get a bunch of, I don't know, say users and I want you in memory and
I want you to look them up by ID and I want you to do that quickly, right?
Like dictionary.
Yeah, dictionary.
Does look up quickly happen?
Is that the question?
Dictionary.
Just yell dictionary.
Dictionary.
Exactly.
Or unique or distinct.
Okay, set, right?
Yeah.
Did they say distinct?
They mean set, right?
Like just right away, there's, you could have like a complicated 10 line for loop where
you test, have you seen it before?
Or set, right?
Like that's both knowing the built-ins and knowing the right data structures, I think.
Yeah.
And it is so much good stuff in the Python standard library or in the core language, you
know, another great one I think that's worth knowing about is in the collections module,
the counter class.
Oh yeah.
It's if you ever need to count different items or, you know, how often does this string
or this word occur?
Right.
I got a list of text.
Like a whole bunch of domain names.
I need to know like how many, each one of them appears.
Right.
That sounds like a challenge or it sounds like two lines.
If you know counter, right?
Yeah.
You create a, you import collections, you create a counter, they're most common.
Right.
But like these things are incredibly simple when you know them, but if you don't know they
exist, it's really challenging.
And I think that's actually a problem from, not a problem, but a, a learning challenge
kind of going back to your other article.
I don't remember which number it was, but the one, I think maybe number two about all
the projects, right?
Like some of those projects would be really easy if you knew the right libraries.
But if you thought I have to write this from pure Python from scratch and I've got to implement
this stuff, right?
Like, oh, that MP3 player is super hard.
Like, let me get down to the bytes and look at it.
Like, no, you pip install like the MP3 library or whatever, like it is that works with that,
right?
It's, there's a whole lot of options.
And I think learning Python is challenging because you learn the language and you think
you've done it, but you've only like hit the 10%.
Now you've got to learn the standard library.
Then you've got to learn everything on awesome Python or PyPI or, right?
So there's these levels.
And, you know, but I do think for tests, for interviewing, knowing the foundational stuff
is most important.
I agree.
Yeah.
And we were thinking, you know, we're going to pick stuff that is actually very likely to
come up in an interview because in an interview, I think you're not going to get super specific.
You know, you're not going to talk about the LMHDB or whatever the lightning memory database
that we talked about earlier.
That would be, nobody's going to expect, I mean, depending on the kind of role, but if
it's, if it's data science, they might expect you to know NumPy.
Right.
If you've claimed, you know, Python, you better know NumPy at least cursory, right?
Yeah.
And if you claim that you, you especially better know about things like the collections module,
you know, these like core things.
Yeah.
For sure.
Yeah.
What about when you get stumped?
What is your thoughts on like, you know, how do I do this thing?
Like, you know, inside your thing, screaming, like I have no idea.
Yeah.
I start sweating profusely and shivering.
Go into the fetal position.
That's why I'm running my own company now.
Yeah.
No, that's a tough one.
I think the advice that I would give is start asking questions because it's oftentimes not
a good sign if you ask someone a question in an interview setting and they immediately launch
into writing code or they feel like they're expected to know the answer off the bat.
A lot of times what the interviewer will want to see is how are you approaching a problem?
Are you able to get help?
Are you able to ask intelligent questions?
And even if you don't know the specifics, I mean, nobody really expects that, right?
A lot of times if you can use Google, if you can use Stack Overflow, if you can use, you
know, Talk Python and RealPython and all these sites that are available to you, you would have
that in your normal working environment.
You know, like I use Google and Stack Overflow like probably like hundreds of times in a productive
day.
I use it shamelessly without guilt or judgment, right?
I mean, because there's a bunch of stuff that you need to know and then there's a bunch
of stuff that just doesn't deserve to take up space in your memory, right?
And you should just be able to go, I'm just going to Google it.
I don't know what the right way to do this library with that thing is.
I'm going to Google it.
But just like actually knowing that it exists and I just don't remember quite how to use
it, I think is like the big step.
Like I know I know there's a counter thing and I know I can get it to group by the count.
I just don't remember how to the steps to make that happen, right?
Like I think that's okay.
Yeah, I think that's totally okay.
So just duck, duck, go it.
Just bing it.
Google it.
Just duck, duck, go it.
AltaVista it.
I don't know what else is there.
Yahoo it.
Yeah, yeah.
AltaVista.
That's a good one.
I remember that.
That was good.
One other thing I would sort of put out there is like a huge turnoff to me if I was
interviewing, I did that for a while with people.
If I feel like they are lying to me, they're done.
I don't care if they seem good.
If I say like, oh, how would you do that with SQLAlchemy?
Oh, like I've used so much SQLAlchemy.
And then you can tell like they've never, ever, ever seen it, right?
Like they don't even, they can't even describe like, well, what I would do is create a class
that derives from like another class and it maps to the database.
Like that's a foreign idea.
But they're claiming like they've used it in production.
Like done.
Not a good strategy.
Not, I would, I don't know.
How do you feel?
Like, would you hire that person?
Because everything else comes to the question, right?
I agree.
It's, it's, yeah.
It's at that.
You want to find, find out, would you ask the interviewer?
I feel like you also want to find out, would you want to have this person on your team?
Would you want to work with them?
Right.
Would I trust them to be?
Yeah.
They start making up stuff like, hey, you know, did you review that pull request or request?
Or did you merge that hot fix?
Or did you, I don't know, do that?
And then you feel like you can't really rely on that person and it's not a good start.
Or we're going to build an e-commerce backend.
Who's done payment stuff before and feels like they can do it, right?
And maybe not.
I don't know.
Definitely use floats for currency.
Yeah.
I don't know if we have that one in the list, but that's, that's also a really common question.
I feel like where people are like, oh, what data type should you use to represent currency
in your program?
Right.
Integers probably.
Yeah.
And then break it down to sense and then use integers.
Yeah.
Just round it.
About a dollar.
Yeah.
It's all good.
It's about a dollar.
All right.
Well, we're coming up on the, the grand finale here.
And this is another one that I could, I'm very passionate about.
I could riff on for a long time.
So you'll have to stop me at some point, but it has to do with the object oriented programming
component of Python.
Yeah.
So the article is called inheritance and composition, a Python OOP guide by Isaac Rodriguez.
And I think inheritance and composition, that is the, one of the core pieces of object oriented
programming.
And in my experience, it's also the piece that if you're completely new to OOP and you're trying
to understand, okay, well, how is this helpful?
Like how does this work?
It can be a sticking point for some people.
Yeah.
So we wanted to do a dedicated article that is, yeah, basically a deep dive on inheritance.
It sounds a little bit like modeling with objects and just like some practices around
that.
Right.
Yeah.
And how do you go about like breaking down a hierarchy or like, I guess a domain into a
hierarchy of objects?
Yes.
Yeah, exactly.
That was getting at.
And so maybe we should define inheritance and composition.
I think inheritance is pretty clear.
Composition might be a little less well known.
So inheritance is, I want to model like a bunch of cars.
So I have a basic car or just a car, but then I have a sports car that does sporty things,
right?
Maybe it has like paddle shifters or it has like a manual transmission mode that has additional
functionality.
So I might say, all right, well, the idea is what we're going to do is we're going to
create a car and a sports car.
And then maybe I want to have a track car that can also take slicks.
Like, so it derives from sports car.
And the deeper that those get, the more full of the abstractions can break down pretty hard,
right?
Like, you know, if you model creatures, I've got a living animal and then I've got a bird
and then I've got, what do you do with a robot bird, right?
Does it drive from bird?
That's a hard one.
Right.
Like it, it has bird like things, but the animal eats, robot doesn't eat.
Right.
So like if you go too deep, it makes, it's a problem.
Right.
So that's inheritance, obviously.
Composition.
Tell us about it.
So composition.
So if inheritance defines is a relationship.
So like a sports car is a car and the car is a vehicle and a vehicle is a thing or whatever
machine.
Composition defines a, has a relationship.
So you can say, okay, a car has an engine or a car has a steering wheel.
Right.
And it has a transmission.
Instead of making a sports car, maybe you just make a car with a sporty transmission.
Right.
And so the whole thing doesn't have to like, because I don't know, what if you have some
kind of truck, but it also has like a manual shifting thing, right?
It could, right.
You wouldn't have a truck derived from a sports car.
That would be weird.
Right.
But you could easily like interchange the parts and it, it helps really alleviate some
of those like deep object hierarchies.
I think.
Yeah.
It's, it's basically another tool in your toolbox there for defining these relationships.
Because if, if you define everything in terms of a inheritance relationship, then you end
up with these unmaintainable, like the, you end up on the dark side of OOP.
That's right.
And like small changes to like a deep down base class can make absurd things in the end, like
a robot that has to eat or something like that.
Cause maybe the animal didn't eat at first and that made sense.
But now later you realize all the animals have to eat.
And then like, well, what do you do about the robot thing that we put there?
Like that's where you use multiple inheritances, which is like a whole dutter of can of worms.
That's a deep, that's a big can of worms as well for sure.
But I, I'm a big fan of composition.
I think, I can't remember where I heard, I'm pretty sure the original gang of four design
patterns books said prefer composition over inheritance.
Yeah.
Like you want shallow hierarchies.
Yeah.
Like you're going to like it's objects and inherits aren't inherently bad, but they're
easy to abuse.
And so composition is a really way, good way to keep those shallow and interchangeable and
small.
So yeah, quite, quite cool.
I like this one a lot.
Wow.
Did we really make it to the, all the way?
Oh, actually speaking of the gang of four book, I think that might be a recommendation
here at the end of the article because we, yeah.
Also always give.
Yeah.
So the article comes with recommended reading, right?
Yeah.
It's got some cool design, design patterns.
Uh, head first design patterns, clean code, solid principles, list cove substitution principle,
all those kinds of things.
Yeah.
A lot of these apply.
It would be remiss of us, I think, to riff so fondly on like an object oriented story in
Python without seeing that like a lot of what people do with objects and classes and other
languages is simply unnecessary in Python.
Right.
So there is a little bit of pushback and well, I know you did Java and everything had
to be a class.
You don't have to build it this way.
Right.
Like for example, if you have a variable that you need to be basically a singleton and then
you want to group a bunch of functions together, you could have a static class that has those
in there in like Java or C# or something like that.
But you could also in Python just have a module that has a variable and it has functions.
And then if you just import that module, you say that module dot the, the fields or the
variables or the functions, that's the same thing as a static class.
Right.
Yeah.
Right.
You don't have, and you don't, it saves you a bunch of work and it's, it's more Pythonic.
Yes.
I guess.
Right.
Then making everything a class.
Yeah.
So there, I mean, maybe there's a little bit of, do I really need a class for that?
Right.
If you're going to create different ones over there, different values at the same time, like,
well, probably.
Right.
But maybe if you're like just trying to group stuff, maybe the modules, right thing.
But if you do decide and it does make sense to have a class, this inheritance versus composition
thing is super important to understand.
Yeah, absolutely.
And I don't want to give the impression that like, you know, if you, if you're writing in an object
oriented programming state style, that that's somehow superior or like the end
all, you know, of, of coding.
I don't, I don't think that's, that's actually true.
I think the, the really powerful thing is understanding these tools, like to have a really
big toolbox and being able to pick the things that make the most sense.
Like a lot of times, you know, when, when I'm writing a program in Python or I'm sketching
something out, I, I'll hardly like write any classes depending on, on the use case.
Or I found myself, you know, most recently just basically adding like these, like, so I've
been working on the real Python platform a lot and I've been writing more function-based
codes or procedural code where maybe my data model is class-based, but then I'll have,
you know, a module or I don't know, redeeming access codes or coupon codes or something like
that.
And it basically defines like a really nice high level interview interface to me.
These are the five operations you do on coupons or something, right?
Yeah.
And that's all function-based.
Yeah.
And then internally they, they use classes to kind of represent the data and, and shuffle
it around.
Probably working with Django ORM or something like that.
Right.
Yeah.
Instead of cramming that all into a view or actually I prefer, for example, a function-based
views in Django instead of class-based views because I don't like sort of the getting the
deeper intendation.
I would, we could, we could get into all kinds of, disagreements there, but, yeah,
just, just want to make sure, you know, that, that I get this across that, I don't
think the OOP coding style is, not the one true way that the one true way that this
should be one, exactly one way to do things.
Yeah.
But if you're going to do it, like understanding this, this difference between inheritance
composition, certainly, it certainly makes sense.
I do a lot of what you're recommending there as well.
All right.
Well, that's our top 10 items, Dan.
Yeah.
That, that went by super fast.
Yeah.
It did go by fast, but I think these all have special value and, you know, people might
be kicking back.
A lot of folks have vacation time around this time of year.
You know, they're also thinking of what's coming in the next year in 2020.
I mean, first of all, let's just take a moment and say, thank you, Python 2, but goodbye.
Yeah.
Bye-bye.
We'll miss you.
The death plot is down to single digit days probably at this point.
Right.
So that's actually pretty exciting.
Yeah.
That's a big change, right?
Yeah.
You're right.
Yeah.
Cool.
All right.
Well, there's a bunch of articles for people to check out while they're on vacation, got
some time away from work.
They don't have to, you know, fill out TPS reports all day.
Smashed out printer.
That's right.
Smashed out printer.
Awesome.
All right.
Well, thanks for being here as always.
Cool.
Yeah.
Thanks for inviting me.
This is great.
You're welcome.
I guess I should ask you the two questions before you go.
So the two questions are, what editor do you use to write Python code these days?
So I've started to use Visual Studio Code a lot.
I use Sublime Text.
Yeah.
It's a pretty similar style of editor.
Very similar.
Right.
Yeah.
What I still love about Sublime is just how fast it is.
Like there's a noticeable difference in the rendering speed and scrolling around.
But the Python integration that VS Code has out of the box is really cool.
It's growing and growing all the things it can do.
I like it for recording video courses because I can have an integrated shell there.
I can have a setup that looks really, really nice, I think.
And so I've been doing that a lot recently.
And so, yeah.
Working out of VS Code.
Yeah.
Awesome.
The other question changing for today.
What's next for RealPython in 2020?
100 authors?
Yeah.
That's a big goal of mine.
You know, I want to, I would love to have 100 authors published on the site.
Authors and instructors as a magical number.
And, you know, maybe we'll crack that 3 million visitors.
I don't know how many Python developers are out there.
Well, I suspect after they listen to this episode, it'll probably be 3 million straight up.
It'll be 10 more.
For sure.
It's going to, yeah.
Awesome.
Well, best of luck in 2020 and keep up the good work.
It's a huge resource for everyone.
Thank you.
I mean, you know, same to you.
Like, it's been so cool just becoming friends with you.
And when we first met, which was, I think, like three years ago.
Three or four years ago.
It's quite a while back.
And just being on this journey here together.
I really appreciate that.
Yeah, absolutely.
Thank you.
Same to you.
It's been fun to be on it together.
Awesome, man.
All right.
Well, catch you later.
Bye.
Yeah.
Bye-bye.
This has been another episode of Talk Python to Me.
Our guest on this episode was Dan Bader.
And it's been brought to you by Linode and Brilliant.org.
Start your next Python project on Linode's state-of-the-art cloud service.
Just visit talkpython.fm/Linode.
L-I-N-O-D-E.
You'll automatically get a $20 credit when you create a new account.
Brilliant.org encourages you to give the gift
of critical thought and knowledge.
Visit talkpython.fm/brilliant and grab a gift subscription to help your loved ones finish
their day a little smarter this season.
Want to level up your Python?
If you're just getting started, try my Python Jumpstart by Building 10 Apps course.
Or if you're looking for something more advanced, check out our new async course that digs into
all the different types of async programming you can do in Python.
And of course, if you're interested in more than one of these, be sure to check out our
Everything Bundle.
It's like a subscription that never expires.
Be sure to subscribe to the show.
Open your favorite podcatcher and search for Python.
We should be right at the top.
You can also find the iTunes feed at /itunes, the Google Play feed at /play,
and the direct RSS feed at /rss on talkpython.fm.
This is your host, Michael Kennedy.
Thanks so much for listening.
I really appreciate it.
Now get out there and write some Python code.
I'll see you next time.