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”.

Preparation

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. (See the privacy statement.)

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.

Finishing

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,

Day 2

  • Livehacking: Iteration, Comprehensions, and Generators, covering

    • List comprehensions

    • The range function

    • Writing generators using yield

    • Generator expressions

  • Livehacking OO

    • joerg-livehacking/oo.py

      • initially: Thermometer, ctor, get_temperature()

      • __init__, self, etc. (self can also read this)

      • 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 what abc can do

      • explain “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 the get_temperature_celsius() method.

      • A collaboration with a competitor is launched. That competitor has a similar set of thermometer implementations. The difference between Eana and Unser is that Eana thermometers do not support get_temperature_celsius(), but rather only get_temperature_fahrenheit().

      • We employ the adapter pattern and create one special thermometer in the Unser hierarchy

        class 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 in print()

    • 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, and Project/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 implement sensor.sensordata.HistoryData.

    • Slowly fix things, in a test driven way. Discuss, team giving input, all really fine.

Day 4

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.

Graph

cluster_python Python cluster_python_swdev Software Development cluster_python_drafts Python Drafts cluster_python_drafts_ai Machine Learning, Artificial Intelligence cluster_python_basics Basics python_python_1010_generators_yield Iteration, and Generators: the yield Keyword python_basics_python_0270_functions Functions python_python_1010_generators_yield->python_basics_python_0270_functions python_basics_python_0220_for for Loops python_python_1010_generators_yield->python_basics_python_0220_for python_basics_python_0200_sequential_types Sequential Datatypes python_python_1010_generators_yield->python_basics_python_0200_sequential_types python_basics_python_0225_range The range Function python_python_1010_generators_yield->python_basics_python_0225_range python_swdev_python_1050_oo Object Oriented Programming python_swdev_python_1050_oo->python_basics_python_0270_functions python_basics_python_0450_dictionaries More on Dictionaries python_swdev_python_1050_oo->python_basics_python_0450_dictionaries python_swdev_python_1100_exceptions Exception Handling python_swdev_python_1100_exceptions->python_swdev_python_1050_oo python_swdev_python_1100_exceptions->python_basics_python_0270_functions python_basics_python_0140_variables Variables python_swdev_python_1100_exceptions->python_basics_python_0140_variables python_swdev_python_1200_modules Modules and Packages python_swdev_python_1200_modules->python_swdev_python_1050_oo python_swdev_python_1200_modules->python_basics_python_0270_functions python_swdev_python_1200_modules->python_basics_python_0140_variables python_drafts_encoding Encoding python_basics_python_0150_datatypes_overview Datatypes python_drafts_encoding->python_basics_python_0150_datatypes_overview python_basics_python_0500_files File I/O python_drafts_encoding->python_basics_python_0500_files python_basics_python_0330_strings_encoding Strings and Encoding python_drafts_encoding->python_basics_python_0330_strings_encoding python_drafts_installation Python Installation python_drafts_duck_typing Duck Typing vs. Strong Typing (incomplete) python_drafts_duck_typing->python_basics_python_0140_variables python_drafts_pip Python Package Index python_drafts_import The import Statement (incomplete) python_drafts_pip->python_drafts_import python_drafts_special_methods Special Methods, Operator Overloading (incomplete) python_drafts_special_methods->python_swdev_python_1050_oo python_drafts_closures Closures python_drafts_closures->python_basics_python_0270_functions python_drafts_starargs Positional and Keyword Arguments python_drafts_starargs->python_basics_python_0270_functions python_drafts_exceptions Exception Handling (incomplete) python_drafts_exceptions->python_swdev_python_1100_exceptions python_drafts_venv Virtual Environments python_drafts_venv->python_drafts_pip python_drafts_venv->python_drafts_import python_drafts_context_manager Context Managers (the with Statement) (incomplete) python_drafts_context_manager->python_python_1010_generators_yield python_drafts_context_manager->python_drafts_exceptions python_drafts_decorators Decorators python_drafts_context_manager->python_drafts_decorators python_drafts_context_manager->python_basics_python_0140_variables python_drafts_decorators->python_drafts_special_methods python_drafts_decorators->python_drafts_closures python_drafts_decorators->python_drafts_starargs python_drafts_decorators->python_basics_python_0270_functions python_drafts_import->python_swdev_python_1200_modules python_drafts_ai_machine_learning_intro Machine Learning: Concepts and Terminology python_drafts_ai_k_means K-Means python_drafts_ai_k_means->python_drafts_venv python_drafts_ai_k_means->python_drafts_ai_machine_learning_intro python_drafts_ai_linear_regression Linear Regression python_drafts_ai_k_means->python_drafts_ai_linear_regression python_drafts_ai_linear_regression->python_drafts_venv python_drafts_ai_linear_regression->python_drafts_ai_machine_learning_intro python_basics_python_0170_if The if Statement python_basics_python_0160_boolean Boolean python_basics_python_0170_if->python_basics_python_0160_boolean python_basics_python_0150_datatypes_overview->python_basics_python_0140_variables python_basics_python_0250_refs_flat_deep_copy References, (Im)mutability python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0150_datatypes_overview python_basics_python_0150_datatypes_overview_compound Compound Datatypes python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0150_datatypes_overview_compound python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0140_variables python_basics_python_0150_datatypes_overview_compound->python_basics_python_0150_datatypes_overview python_basics_python_0270_functions->python_basics_python_0150_datatypes_overview python_basics_python_0270_functions->python_basics_python_0140_variables python_basics_python_0220_for->python_basics_python_0200_sequential_types python_basics_python_0193_while while Loops python_basics_python_0220_for->python_basics_python_0193_while python_basics_python_0450_dictionaries->python_basics_python_0150_datatypes_overview_compound python_basics_python_0450_dictionaries->python_basics_python_0220_for python_basics_python_0160_boolean->python_basics_python_0150_datatypes_overview python_basics_python_0200_sequential_types->python_basics_python_0150_datatypes_overview python_basics_python_0500_files->python_basics_python_0220_for python_basics_python_0500_files->python_basics_python_0330_strings_encoding python_basics_python_0110_blahblah Blahblah python_basics_python_0130_syntax_etc Syntax etc. python_basics_python_0140_variables->python_basics_python_0130_syntax_etc python_basics_python_0300_strings More About Strings python_basics_python_0300_strings->python_basics_python_0150_datatypes_overview python_basics_python_0300_strings->python_basics_python_0250_refs_flat_deep_copy python_basics_python_0300_strings->python_basics_python_0200_sequential_types python_basics_python_0193_while->python_basics_python_0170_if python_basics_python_0193_while->python_basics_python_0160_boolean python_basics_python_0225_range->python_basics_python_0220_for python_basics_python_0225_range->python_basics_python_0200_sequential_types python_basics_python_0120_helloworld Hello World python_basics_python_0120_helloworld->python_basics_python_0110_blahblah python_basics_python_0130_syntax_etc->python_basics_python_0120_helloworld python_basics_python_0330_strings_encoding->python_basics_python_0300_strings