PySnooper/ADVANCED_USAGE.md

2.6 KiB

Advanced Usage

Use watch_explode to expand values to see all their attributes or items of lists/dictionaries:

@pysnooper.snoop(watch_explode=('foo', 'self'))

watch_explode will automatically guess how to expand the expression passed to it based on its class. You can be more specific by using one of the following classes:

import pysnooper

@pysnooper.snoop(watch=(
    pysnooper.Attrs('x'),    # attributes
    pysnooper.Keys('y'),     # mapping (e.g. dict) items
    pysnooper.Indices('z'),  # sequence (e.g. list/tuple) items
))

Exclude specific keys/attributes/indices with the exclude parameter, e.g. Attrs('x', exclude=('_foo', '_bar')).

Add a slice after Indices to only see the values within that slice, e.g. Indices('z')[-3:].

$ export PYSNOOPER_DISABLED=1 # This makes PySnooper not do any snooping

This will output lines like:

Modified var:.. foo[2] = 'whatever'
New var:....... self.baz = 8

Start all snoop lines with a prefix, to grep for them easily:

@pysnooper.snoop(prefix='ZZZ ')

Remove all machine-related data (paths, timestamps, memory addresses) to compare with other traces easily:

@pysnooper.snoop(normalize=True)

On multi-threaded apps identify which thread are snooped in output:

@pysnooper.snoop(thread_info=True)

PySnooper supports decorating generators.

If you decorate a class with snoop, it'll automatically apply the decorator to all the methods. (Not including properties and other special cases.)

You can also customize the repr of an object:

def large(l):
    return isinstance(l, list) and len(l) > 5

def print_list_size(l):
    return 'list(size={})'.format(len(l))

def print_ndarray(a):
    return 'ndarray(shape={}, dtype={})'.format(a.shape, a.dtype)

@pysnooper.snoop(custom_repr=((large, print_list_size), (numpy.ndarray, print_ndarray)))
def sum_to_x(x):
    l = list(range(x))
    a = numpy.zeros((10,10))
    return sum(l)

sum_to_x(10000)

You will get l = list(size=10000) for the list, and a = ndarray(shape=(10, 10), dtype=float64) for the ndarray. The custom_repr are matched in order, if one condition matches, no further conditions will be checked.

Variables and exceptions get truncated to 100 characters by default. You can customize that:

    @pysnooper.snoop(max_variable_length=200)

You can also use max_variable_length=None to never truncate them.

Use relative_time=True to show timestamps relative to start time rather than wall time.

The output is colored for easy viewing by default, except on Windows. Disable colors like so:

    @pysnooper.snoop(color=False)