Skip to main content

A poor man's debugger for Python.

Project description

WORK-IN-PROGRESS, NOT USABLE YET

PySnooper - Never use print for debugging again

Travis CI

PySnooper is a poor man's debugger.

You're trying to figure out why your Python code isn't doing what you think it should be doing. You'd love to use a full-fledged debugger with breakpoints and watches, but you can't be bothered to set one up right now.

You're looking at a section of Python code. You want to know which lines are running and which aren't, and what the values of the local variables are.

Most people would use a print line. Probably several of them, in strategic locations, some of them showing the values of variables. Then they'd use the output of the prints to figure out which code ran when and what was in the variables.

PySnooper lets you do the same, except instead of carefully crafting the right print lines, you just add one decorator line to the function you're interested in. You'll get a play-by-play log of your function, including which lines ran and when, and exactly when local variables were changed.

What makes PySnooper stand out from all other code intelligence tools? You can use it in your shitty, sprawling enterprise codebase without having to do any setup. Just slap the decorator on, as shown below, and redirect the output to a dedicated log file by specifying its path as the first argument.

Example

We're writing a function that converts a number to binary, by returing a list of bits. Let's snoop on it by adding the @pysnooper.snoop() decorator:

import pysnooper

@pysnooper.snoop()
def number_to_bits(number):
    if number:
        bits = []
        while number:
            number, remainder = divmod(number, 2)
            bits.insert(0, remainder)
        return bits
    else:
        return [0]

number_to_bits(6)

The output to stderr is:

Starting var:.. number = 6
21:14:32.099769 call         3 @pysnooper.snoop()
21:14:32.099769 line         5     if number:
21:14:32.099769 line         6         bits = []
New var:....... bits = []
21:14:32.099769 line         7         while number:
21:14:32.099769 line         8             number, remainder = divmod(number, 2)
New var:....... remainder = 0
Modified var:.. number = 3
21:14:32.099769 line         9             bits.insert(0, remainder)
Modified var:.. bits = [0]
21:14:32.099769 line         7         while number:
21:14:32.099769 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
21:14:32.099769 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
21:14:32.099769 line         7         while number:
21:14:32.099769 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 0
21:14:32.099769 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
21:14:32.099769 line         7         while number:
21:14:32.099769 line        10         return bits
21:14:32.099769 return      10         return bits

Features

If stderr is not easily accessible for you, you can redirect the output to a file easily:

@pysnooper.snoop('/my/log/file.log')

See values of some variables that aren't local variables:

@pysnooper.snoop(variables=('foo.bar', 'self.whatever'))

Show snoop lines for functions that your function calls:

@pysnooper.snoop(depth=2)

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

@pysnooper.snoop(prefix='ZZZ ')

Installation

Use pip:

pip install pysnooper

Copyright

Copyright (c) 2019 Ram Rachum, released under the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

PySnooper-0.0.1.tar.gz (7.4 kB view details)

Uploaded Source

Built Distribution

PySnooper-0.0.1-py2.py3-none-any.whl (10.2 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file PySnooper-0.0.1.tar.gz.

File metadata

  • Download URL: PySnooper-0.0.1.tar.gz
  • Upload date:
  • Size: 7.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.2

File hashes

Hashes for PySnooper-0.0.1.tar.gz
Algorithm Hash digest
SHA256 01d8f9318adc0ece18fbe73b2346dead30fe59c09e67763c7f9812174515085b
MD5 8d3f3765640c483eacf16bc34d9ef42f
BLAKE2b-256 dca3c15553942bc3939ca800a893ac7c68b0f140101a6f4777cc1156e4699da0

See more details on using hashes here.

File details

Details for the file PySnooper-0.0.1-py2.py3-none-any.whl.

File metadata

  • Download URL: PySnooper-0.0.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 10.2 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.2

File hashes

Hashes for PySnooper-0.0.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 fc77181a12494e5e0a22f2aa48748b69f7f7611d4da4a621f7cfecf860086992
MD5 4571b46fb58441e70d9d8a782d113aed
BLAKE2b-256 824f5e547daa8910f1d8e1807fbcf6aa344592a2a866f342a4c6065fdf914df1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page