pdbr is intended to make the PDB results more colorful. it uses Rich library to carry out that.
Install with pip
or your favorite PyPi package manager.
pip install pdbr
In order to use breakpoint()
, set PYTHONBREAKPOINT with "pdbr.set_trace"
import os
os.environ["PYTHONBREAKPOINT"] = "pdbr.set_trace"
or just import pdbr
import pdbr
🍦 Icecream print.
Search a phrase in the current frame. In order to repeat the last one, type / character as arg.
It can be used for Django model queries as follows.
>>> sql str(Users.objects.all().query)
[ val,lexer ] Display lexer.
Get the local variables list as table.
Get the local variables list as tree.
Config is specified in setup.cfg and can be local or global. Local config (current working directory) has precedence over global (default) one. Global config must be located in $XDG_CONFIG_HOME/pdbr/
directory.
In order to use Rich's traceback, style, and theme:
[pdbr]
style = yellow
use_traceback = True
theme = friendly
store_history setting is used to keep and reload history, even the prompt is closed and opened again:
[pdbr]
...
store_history=.pdbr_history
In order to use Celery remote debugger with pdbr, use celery_set_trace
as below sample. For more information see the Celery user guide.
from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
import pdbr; pdbr.celery_set_trace()
return x + y
Instead of using telnet
or nc
, in terms of using pdbr style, pdbr_telnet
command can be used.
Also in order to activate history and be able to use arrow keys, install and use rlwrap package.
rlwrap -H '~/.pdbr_history' pdbr_telnet localhost 6899
pdbr
integrates with IPython.
This makes %magics
available, for example:
(Pdbr) %timeit range(100)
104 ns ± 2.05 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
To enable IPython
features, install it separately, or like below:
pip install pdbr[ipython]
In order to use pdbr
with pytest --pdb
flag, add addopts
setting in your pytest.ini.
[pytest]
addopts: --pdbcls=pdbr:RichPdb
pdbr_context
and apdbr_context
(asyncio
corresponding) can be used as with statement or decorator. It calls post_mortem
if traceback
is not none.
from pdbr import apdbr_context, pdbr_context
@pdbr_context()
def foo():
...
def bar():
with pdbr_context():
...
@apdbr_context()
async def foo():
...
async def bar():
async with apdbr_context():
...
To being activated the pdb in Django test, change TEST_RUNNER
like below. Unlike Django (since you are not allowed to use for smaller versions than 3), pdbr runner can be used for version 1.8 and subsequent versions.
TEST_RUNNER = "pdbr.runner.PdbrDiscoverRunner"
from fastapi import FastAPI
from pdbr.middlewares.starlette import PdbrMiddleware
app = FastAPI()
app.add_middleware(PdbrMiddleware, debug=True)
@app.get("/")
async def main():
1 / 0
return {"message": "Hello World"}
In order to catch the problematic codes with post mortem, place the middleware class.
MIDDLEWARE = (
...
"pdbr.middlewares.django.PdbrMiddleware",
)
Running pdbr
command in terminal starts an IPython
terminal app instance. Unlike default TerminalInteractiveShell
, the new shell uses pdbr as debugger class instead of ipdb
.
If pdbr
command is used with an argument, it is invoked as a script and debugger-commands can be used with it.
# equivalent code: `python -m pdbr -c 'b 5' my_test.py`
pdbr -c 'b 5' my_test.py
>>> Breakpoint 1 at /my_test.py:5
> /my_test.py(3)<module>()
1
2
----> 3 def test():
4 foo = "foo"
1 5 bar = "bar"
(Pdbr)
To create or edit your own snippets, select User Snippets under File > Preferences (Code > Preferences on macOS), and then select python.json.
Place the below snippet in json file for pdbr.
{
...
"pdbr": {
"prefix": "pdbr",
"body": "import pdbr; pdbr.set_trace()",
"description": "Code snippet for pdbr debug"
},
}
For Celery debug.
{
...
"rdbr": {
"prefix": "rdbr",
"body": "import pdbr; pdbr.celery_set_trace()",
"description": "Code snippet for Celery pdbr debug"
},
}