Delving deeper into Python functions and learning more about them, using Reuven Lerner’s Advanced Python Functions Course
Notes
- The
co_*series of attributes inside the__code__attribute inside most functions gives a wealth of information about a function.- For example, looking up the argcount attribute for some function hello, with
hello.__code__.co_argcountwill give us the number of argumentshellotakes. - And doing a
hello.__code__.co_varnameswill give us a tuple of all the local variables in a function hello.__code__.co_codecontains the compiled bytecode for the function.- Importing the disassembler
import disand running it on the bytecode,dis.dis(hello)will show us what’s in there.
- Importing the disassembler
hello.__code__.co_flagskeeps a track of whether the function has * arguments or not via a binary switch. (It holds many parameters, one of which is the on/off switch for *args)- if said switch is set, the function checks for such arguments at runtime and turns them into a tuple to process.
- they are set for *args via the
hello.__code__co_argcountswitch (0/1) and for keyword arguments with thehello.__code__.co_kwonlyargcountswitch.
- For example, looking up the argcount attribute for some function hello, with
- the
__defaults__attribute keeps all the functions default variable values. If I don’t supply a value to some parameter, the function will look in here, to see if a default value exists.hello.__defaults__could hold a last name default, for example, if I want my hello function to work even if no last name was supplied, and it actually expected a full name.- do not use mutable defaults. an empty list or dictionary for example.
- set the default to
Nonefirst in such case and then create the list when the function runs at runtime.
- The last thing I learnt about were nested functions.
- I can nest them two/three/as many levels deep as I wish. Practically, most folks do two or three.
- When an inner function takes the variables of its enclosure and does something with it and returns stuff…? those kinds of functions are called closures.
Learning / Feedback/ Experiences from doing exercises
- The course so far is Reuven making simple functions and then breaking them down and explaining functionality in painstaking detail.
- Reuven is an awesome teacher! I would gush about him every post, but then it would get too much 😂. So once per course is good
- I kept looking at the disassembled code and wondering, what language it was. I still don’t know. My ‘educated’ guess is that it is a level of standard pseudo-assembly code for some phantom standardised processor. Once I had that mental model in mind though, all of it started making a lot more sense. This brought memories of Z80 assembly, I learnt in the mid 90s
- This was fun to do! Onwards to Advanced Objects!
Read all about my Python Functions journey here