I am trying to learn how an application works. And for this I am inserting debug commands as the first line of each function\'s body with the goal of logging the function\'s
You have a few marginally related questions here.
I'll start with the easiest: (3). Using logging
you can aggregate all calls to a single log file or other output target: they will be in the order they occurred in the process.
Next up: (2). locals()
provides a dict of the current scope. Thus, in a method that has no other arguments, you have self
in scope, which contains a reference to the current instance. The trick being used that is stumping you is the string formatting using a dict as the RHS of the %
operator. "%(foo)s" % bar
will be replaced by whatever the value of bar["foo"]
is.
Finally, you can use some introspection tricks, similar to those used by pdb
that can log more info:
def autolog(message):
"Automatically log the current function details."
import inspect, logging
# Get the previous frame in the stack, otherwise it would
# be this function!!!
func = inspect.currentframe().f_back.f_code
# Dump the message + the name of this function to the log.
logging.debug("%s: %s in %s:%i" % (
message,
func.co_name,
func.co_filename,
func.co_firstlineno
))
This will log the message passed in, plus the (original) function name, the filename in which the definition appears, and the line in that file. Have a look at inspect - Inspect live objects for more details.
As I mentioned in my comment earlier, you can also drop into a pdb
interactive debugging prompt at any time by inserting the line import pdb; pdb.set_trace()
in, and re-running your program. This enables you to step through the code, inspecting data as you choose.