Skip to main content

A poor man's debugger for Python.

Project description

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 want to know which lines are running and which aren't, and what the values of the local variables are.

Most people would use print lines, in strategic locations, some of them showing the values of 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 returning 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
15:29:11.327032 call         4 def number_to_bits(number):
15:29:11.327032 line         5     if number:
15:29:11.327032 line         6         bits = []
New var:....... bits = []
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
New var:....... remainder = 0
Modified var:.. number = 3
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 0
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line        10         return bits
15:29:11.327032 return      10         return bits
Return value:.. [1, 1, 0]

Features

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

@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

$ pip install pysnooper

Contribute

Pull requests are always welcome! Please, write tests and run them with Tox.

Tox installs all dependencies automatically. You only need to install Tox itself:

$ pip install tox

List all environments tox would run:

$ tox -lv

If you want to run tests agains all target Python versions use pyenv to install them. Otherwise, you can run only linters and the ones you have already installed on your machine:

# run only some environments
$ tox -e flake8,pylint,bandit,py27,py36

Linters and tests should pass before you push your code. They will be run again on Travis CI.

License

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

I provide Development services in Python and Django and I give Python workshops to teach people Python and related topics.

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.15.tar.gz (9.6 kB view details)

Uploaded Source

Built Distribution

PySnooper-0.0.15-py2.py3-none-any.whl (9.2 kB view details)

Uploaded Python 2 Python 3

File details

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

File metadata

  • Download URL: PySnooper-0.0.15.tar.gz
  • Upload date:
  • Size: 9.6 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.15.tar.gz
Algorithm Hash digest
SHA256 c1b6b3cf81558bbceda82840da25910f2ef3de2d74eb059dab6c1a63feac017e
MD5 05f061a2c8509c072de33a6d0f06c8b7
BLAKE2b-256 4a7f6efffa67240b4f2d0dc1e905b778ab3e9d050d76f83ec1335449234be420

See more details on using hashes here.

File details

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

File metadata

  • Download URL: PySnooper-0.0.15-py2.py3-none-any.whl
  • Upload date:
  • Size: 9.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.15-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 f52349c44d967272510991cf8beb5917d71d8b418b9b6004c0c3f19edb7a3c53
MD5 ab784e06f80cbb3c4c7fc0063833dc7d
BLAKE2b-256 243d7696c6c7a2f28636e1294e592f0126ba48683981d3fd7f4851154d759fac

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