Python Advanced (7.9.2020 - 10.9.2020)#
This is a training for a team which is already experienced in Python programming. There were some special requirements for the training, such as to loose a couple of words about AI/machinelearning and other topics, as well as a fuzzy “bring us advanced stuff”.
The training was accompanied by a lot of improvised live hacking.
Preparation#
Workspace Setup#
Github for Exercises#
Please create Github accounts and send them to training@faschingbauer.co.at. We will do exercises via a private repository on Github.
Agenda#
Advanced Core Python Topics#
Python is easy; one can solve nontrivial problems in only a few lines of code, in no time. This does not mean that you have to fully understand the language - which is good because this is what makes the language easy.
On the other hand, there’s always a line to cross where you wish you knew more. Here the more advanced core Python topics that shall be covered.
Special Topics#
Unit Testing, Test Driven Development, Design Patterns
Web programming with Jango and/or Flask
Log#
Following is a recap of what has happened. File names are relative to the root of the Github repository we were working from.
Day 1#
Rushed through basics,
Put a strong focus on Python features,
while Loops. The
else
clause, mainly - everyone was supposed to know what awhile
loop is.-
else
clauseThe range Function. Whetting appetite for the Iteration livehacking session on day 2.
Day 2#
Livehacking: Iteration, Comprehensions, and Generators, covering
List comprehensions
The
range
functionWriting generators using
yield
Generator expressions
Livehacking OO
-
initially:
Thermometer
, ctor,get_temperature()
__init__
,self
, etc. (self
can also readthis
)th.__dict__
private, pros and cons
properties (r/w)
inheritance
joerg-livehacking/abstract-base-class.py, joerg-livehacking/abstract-base-class.cpp
Insert one step without
abc
before it, and then show whatabc
can doexplain “check errors as early as can” ⟶ at ctor time, rather than at method call time.
-
Livehacking design patterns
joerg-livehacking/composite.py. Using the thermometer hierarchy, a “composite” thermometer was created. That thermometer uses (has) a set of concrete thermometers to calculate the average room temperature.
joerg-livehacking/adapter.py. Fictional scenario …
The
Unser
thermometer framework contains a number of thermometer implementations which all support theget_temperature_celsius()
method.A collaboration with a competitor is launched. That competitor has a similar set of thermometer implementations. The difference between
Eana
andUnser
is thatEana
thermometers do not supportget_temperature_celsius()
, but rather onlyget_temperature_fahrenheit()
.We employ the adapter pattern and create one special thermometer in the
Unser
hierarchyclass EanaAdapter(UnserThermometer): ...
Day 3#
Revisit abstract base classes
Discuss duck typing.
Morph joerg-livehacking/abstract-base-class.py into joerg-livehacking/duck-typing.py.
Explaining how
abc
shifts duck errors from call to initialization
Visitor pattern. Not every pattern in the “Gang of Four” book should be considered a real pattern. For example, the Visitor pattern turn into an idiom for languages that don’t support generators.
joerg-livehacking/visitor.py. Classic OO implementation of the visitor pattern as a DFS traversal. Together with callbacks and all convolutions. Took sideways like,
show how
__call__
makes a class callable.show how
__str__
and__repr__
work together inprint()
joerg-livehacking/visitor-generator.py. “I don’t want to implement a visitor!”, poor user says. “I only want to iterate over the tree in DFS order!”
Implement DFS iteration using
yield from
which delegates iteration into recursion.
TDD and Unit Testing theory; using excerpts from the
Design Patterns
deck of slides. Explain terminology; fixtures and such.Start hacking on project. Agreed upon myself doing live hacking. Doing TDD.
Project/sensor/sensordata.py
, andProject/tests/sensordata_tests.py
. Prepare TDD; explain suites, cases, fixture, assertions.While writing data classes (holding only attributes and no functionality), explain
namedtuple
. Use that to implementsensor.sensordata.HistoryData
.Slowly fix things, in a test driven way. Discuss, team giving input, all really fine.
Day 4#
Decorators theory, and livehacking. Mainly to see how flask routes work.
Continue project; add CSV import.
Project/programs/csvreport.py
sqlite3 export, trying out the DBAPI 2.0 interface.
Project/programs/csv2sqlite3.py
Flask frontend, reading
sqlite3
db.
Project/programs/flaskerl.py
Recommended Tutorials#
We couldn’t cover everything we would have liked to. Here is a random list of tutorial to watch in quiet moments.
Transforming Code into Beautiful, Idiomatic Python. Raymond Hettinger, reiterating his favorite phrase: “There must be a better way”. (Hettinger is a “Python Core Developer”.)
Python Tutorial: Duck Typing and Asking Forgiveness, Not Permission (EAFP). Corey Schafer about Duck Typing, and the word Pythonic. Corey Schafer has a number of very good Tutorials; he manages to keep those short and to the point, and rarely exceeds 15 minutes.
Python Tutorial: Unit Testing Your Code with the unittest Module. Our project was guided by unit tests; here’s Corey Schafer about the
unittest
module.Python Tutorial: Decorators - Dynamically Alter The Functionality Of Your Functions. Corey Schafer about decorators. Mine was better :-)
Built in Super Heroes. David Beazley in an entertaining keynote to the “PyData Chicago 2016” conference. He has a number of very good and entertaining (and very advanced) videos. You have to spend an entire evening with him though.
Concurrency: Raymond Hettinger covering most if not all aspects and possiblities of concurrency. Very informative, very concise, covering
Multithreading
Multiprocessing
Async; I didn’t even mention that. asyncio. Me big fan.
Understanding the Python GIL: David Beazley dissecting the Global Interpreter Lock, explaining why multiprocessing is better. At around minute 45, in the questions/answers, there a mention that using NumPy operations in multiple threads is truly parallel.
Modules and Packages. David Beazley has a three hour (!) really cool and in-depth look into the seemingly simple
import
mechanism.Virtual Environments Tutorial: Corey Schafer again. Virtual environments are kind of an isolated development sandbox, solving a similar problem as containers do, but much more lightweight and Python only.
Packaging, Deployment, PyPI, and pip: Chris Wilcox (of Google) talking about packaging and deployment, and related topics
Generators: The Final Frontier: David Beazley, again a bit (a whopping four hours) more precise on that topic.
NumPy Tutorial: Keith Galli has a number of good data science tutorials.
After Work Party#
From my point of view, the training went really fine. Not everyone is equally satisfied with the outcome (we didn’t get to the AI topics, for example), but I have the impression that I brought it over.
As a gift to myself, I had reserved Thursday night at Gmundner Hütte. After the training I went back to Hoisn Wirt (which is where I stayed during the training - really fine), changed clothes, and started to climb the Traunstein via Zierlersteig.
See here for the description and pictures from this extraordinary hike.