[Python] Tracciare chiamate

Giampaolo Rodolà g.rodola a gmail.com
Gio 20 Set 2012 23:17:04 CEST


Il giorno 18 settembre 2012 03:41, Walter Valenti
<waltervalenti a yahoo.it>ha scritto:

>
>
> >
> > 2012/9/18 Giacomo Alzetta <giacomo.alzetta a gmail.com>:
> >>  On Tuesday 18 September 2012 10:57:41 Walter Valenti wrote:
> >>>  C'è un modo pulito e veloce per tracciare le chiamate ai metodi di
> > una
> >>>  classe, a parte delle print ?
> >
> > Questo sicuramente.
> >
> > O magari intende "tracciare" nel senso dei vari trace del prolog o dei
> > linguaggi funzionali?
> >
>
> Intendo proprio loggare le chiamate Classe.metodo.
>
> Mi guardeṛ i logging.
>
> Walter
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>


Se intendi vedere quali linee vengono eseguite, linea per linea, puoi usare
qualcosa di questo tipo:


# copyright Giampaolo Rodola', license MIT
import sys, linecache

def tracethis(callback=None):
    """A decorator to trace a callable.

    >>> @tracethis()
    ... def foo():
    ...     ret = []
    ...     ret.append(range(10))
    ...     return ret
    ...
    >>> foo()
    __main__:5:     ret = []
    __main__:6:     ret.append(range(10))
    __main__:7:     return ret
    >>>

    Example for logging traces of a certain module only:

    >>> def callback(name, lineno, line):
    ...     if name == __name__:
    ...         print "%s:%s: %s" % (name, lineno, line)
    ...
    >>>
    >>> @tracethis(callback)
    ... def foo():
    ...     pass
    ...
    >>>
    """
    def run(frame, event, arg):
        if event == "line":
            lineno = frame.f_lineno
            filename = frame.f_globals["__file__"]
            if (filename.endswith(".pyc") or
                filename.endswith(".pyo")):
                filename = filename[:-1]
            name = frame.f_globals["__name__"]
            line = linecache.getline(filename, lineno).rstrip()
            if callback is None:
                print "%s:%s: %s" % (name, lineno, line)
            else:
                callback(name, lineno, line)
        return run

    def outer(fun):
        def inner(*args, **kwargs):
            sys.settrace(run)
            try:
                return fun(*args, **kwargs)
            finally:
                sys.settrace(None)
        return inner

    return outer


# test
if __name__ == '__main__':
    @tracethis()
    def foo():
        ret = []
        ret.append(range(10))
        return ret

    foo()


--- Giampaolo
http://code.google.com/p/pyftpdlib/ <http://code.google.com/p/psutil/>
http://code.google.com/p/psutil/
http://code.google.com/p/pysendfile/ <http://code.google.com/p/psutil/>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20120920/490c7f49/attachment-0001.html>


Maggiori informazioni sulla lista Python