Zanurkuj w Pythonie/Źródła/apihelper.py

#-*- coding: utf-8 -*-

u"""Prosty pomocnik API

Ten program jest częścią książki "Zanurkuj w Pythonie", podręcznika
o Pythonie dla doświadczonych programistów. Najnowszą wersję można
znaleźć tu: http://pl.wikibooks.org/wiki/Zanurkuj_w_Pythonie.
 
Program ten został oparty na przykładach zawartych w książce
"Dive Into Python", a dostępnej stąd: http://www.diveintopython.org.
"""

__author__ = "Mark Pilgrim (mark@diveintopython.org)"
__version__ = "$Revision: 1.3 $"
__date__ = "$Date: 2004/05/05 21:57:19 $"
__copyright__ = "Copyright (c) 2001 Mark Pilgrim"
__license__ = "Python"

# Jest to dobry skrypt do nauki introspekcji,
# jednak w prawdziwym świecie lepiej wykorzystywać PyDoc, który jest częścią
# standardowej biblioteki Pythona w wersjach Python 2.1 i nowszych.
#
# Być może twój IDE może już na starcie zaimportował funkcję "help"
# z modułu pydoc, a jeśli nie, zrób to tak:
#
# >>> from pydoc import help
#
# Do funkcja help z tego modułu przekazujemy dowolny obiekt, na którego temat
# chcemy uzyskać pomoc. Możemy do tej funkcji także przekazać
# łańcuch znaków:
#
# >>> help("string") # pomoc na temat modułu string
# >>> help("apihelper.info") # pomoc na temat poniższej funkcji
# >>> help() # włącza interaktywny tryb pomocy
#
# PyDoc może także działać jako serwer HTTP i dynamicznie tworzyć
# dokumentację dowolnego modułu sformatowaną jako HTML.
# Jest to bardzo fajne narzędzie. Więcej na temat PyDoc możemy znaleźć tutaj:
#   http://www.onlamp.com/pub/a/python/2001/04/18/pydoc.html

def info(object, spacing=10, collapse=1):
    u"""Wypisuje metody i ich notki dokumentacyjne.

    Argumentem może być moduł, klasa, lista, słownik, czy też łańcuch znaków."""
    methodList = [e for e in dir(object) if callable(getattr(object, e))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                    (method.ljust(spacing),
                     processFunc(unicode(getattr(object, method).__doc__)))
                    for method in methodList])

if __name__ == "__main__":
    print info.__doc__