/magical_universe

Awesome Python features explained using the world of magic

Primary LanguagePython

Awesome Python Features Explained Using the World of Magic

As outlined in my blog post, I decided to take on a new habit using a technique I found on the 'get disciplined' subreddit.

As one of my new habits I chose: "Code for 15 minutes every day". As part of the habit I've started creating a series of blog posts on important and awesome Python features, including object oriented programming, properties, function annotations, duck typing, etc.

Since I was bored by the usual tutorial examples, I looked for a topic that would make it fun to study and implement the concepts. And since I absolutely love Harry Potter, I started creating my own magical universe around the topics. A short introduction into my magical universe - The Tales of Castle Kilmere can be found here. So if you like magic and want to improve your Python knowledge and skills, get right into it!

A logbook of what I worked on each day can be found on my website.

The code runs in Python 3.6, the code on data classes requires Python 3.7 (or you pip install data classes for Python 3.6).

Start date: 07/23/2018

Keynote at PyCon Estonia and EuroPython

I gave a keynote talk about this project titled "Finding Magic in Python" at PyCon Estonia 2020. So if you are up for some magic and want to see an introduction to some of the topics (like Namedtuples or Abstract Base Classes) check out the recording on YouTube.

I held another talk at EuroPython, check out the recording here.

Running pytest

In case you get ImportError: no module named magical_universe when running pytest from within the test_code directory, take a look at this post and try running pytest from the root directory (which is the home directory in my case) using python -m pytest magical_universe/test_code/.

Overview

Day Topics Blog post with explanations Code for the day
1 Intro to object oriented programming, classes, inheritance Day 1 Code day 1
2 Class methods, instance methods, static methods, using class methods as alternative constructors Day 2 Code day 2
3 Type annotations Day 3 Code day 3
4 To-string conversion, __repr__, __str__ Day 4 Code day 4
5 Decorators Day 5 No new code added
6 Properties, @property and property(), setters, getters Day 6 Code day 6
7 Underscore patterns for variable naming, _variable, __variable, __variable__, etc. Day 7 No new code added
8 New methods and classes added to the HP universe Day 8 Code day 8
9 Duck typing, EAFP principle Day 9 Code day 9
10 & 11 Namedtuples Day 10 & 11 Code day 10 & 11
12 - 15 Abstract Base Classes Day 12 to 15 Code day 12 to 15
16 - 18 Data Classes Day 16 to 18 Code day 16 to 18
19 Immutable Data Classes Day 19 Code day 19
20 Decorators within a class Day 20 Code day 20
21 The mysterious if __name__ == "__main__" Day 21 No new code added
22 - 24 Context managers and the with statement Day 22 to 24 Code day 22 to 24
25 - 28 Testing code with pytest Day 25 to 28 Code day 25 to 28
29 - 31 Iterators, iterables, iteration Day 29 to 31 Code day 29 to 31
32 Test code for Professor class No blog post, see Day 25 to 28 for an introduction to testing Code day 32
33 Test code for Ghost class No blog post, see Day 25 to 28 for an introduction to testing Code day 33
34 Counting objects with Collections.counter Day 34 Day 34
35 Test code for DarkArmyMember class No blog post, see Day 25 to 28 for an introduction to testing Code day 35
36 Test code for Potion class No blog post, see Day 25 to 28 for an introduction to testing Code day 36
37 Extension of Magical Universe with classmethods for Charm, Hex, Curse, etc. Day 37 Code day 37
38 - 39 Test code for Spell class No blog post, see Day 25 to 28 for an introduction to testing Code day 38 to 39
40 - 42 Test code for Pupil class No blog post, see Day 25 to 28 for an introduction to testing Code day 40 to 42
43 - 45 Custom exception classes Day 43 to 45 Code day 43 to 45
46 functools.wraps - Avoiding losing metdata when applying decorators Day 46 Code day 46
47 - 48 collections.defaultdict Day 47 to 48 Code day 47 to 48
49 - 50 Working with config files Day 49 to 50 Code day 49 to 50
51 Wrap up Day 51 No new code added

Feedback

In case you find a mistake in the code or the blog posts, please let me know by opening an issue!