22.9 Documentation Strings Revisited
Chapter 11 covered docstrings in detail in our look
at documentation sources and tools. Docstrings are string literals
that show up at the top of various structures, and are saved by
Python automatically
in
object __doc__ attributes. This works for module
files, function defs, and classes and methods. Now that we know more
about classes and methods, file docstr.py
provides a quick but comprehensive example that summarizes the places
where docstrings can show up in your code; all can be triple-quoted
blocks:
"I am: docstr.__doc__"
class spam:
"I am: spam.__doc__ or docstr.spam.__doc__"
def method(self, arg):
"I am: spam.method.__doc__ or self.method.__doc__"
pass
def func(args):
"I am: docstr.func.__doc__"
pass
The main advantage of documentation strings is that they stick around
at runtime; if it's been coded as a documentation
string, you can qualify an object to fetch its documentation.
>>> import docstr
>>> docstr.__doc__
'I am: docstr.__doc__'
>>> docstr.spam.__doc__
'I am: spam.__doc__ or docstr.spam.__doc__'
>>> docstr.spam.method.__doc__
'I am: spam.method.__doc__ or self.method.__doc__'
>>> docstr.func.__doc__
'I am: docstr.func.__doc__'
The discussion of the PyDoc tool that knows how
to format all these strings in reports appears in Chapter 11. Documentation strings are available at
runtime, but they are also less flexible syntactically than
# comments (which can appear anywhere in a
program). Both forms are useful tools,
and
any program documentation is good (as long as it's
accurate).
Because bound methods automatically pair an instance with a class method
function, you can use them in any place that a simple function is
expected. One of the most common places you'll see
this idea put to work is in code that registers methods as event
callback handlers in the Tkinter GUI interface.
Here's the simple case:
def handler( ):
...use globals for state...
...
widget = Button(text='spam', command=handler)
To register a handler for button click events, we usually pass a
callable object that takes no arguments to the
command keyword argument. Function names (and
lambdas) work here; so do class methods, as long they are bound
methods:
class MyWidget:
def handler(self):
...use self.attr for state...
def makewidgets(self):
b = Button(text='spam', command=self.handler)
Here, the event handler is self.handler—a
bound method object that remembers both self and
MyGui.handler. Because self
will refer to the original instance when handler
is later invoked on events, the method will have access to instance
attributes that can retain state between events. With simple
functions, state normally must be retained in global variables
instead. See also the discussion of __call__
operator overloading in Chapter 21 for another way
to make classes compatible with function-based APIs.
|
|