Package: pout
PoutA collection of handy functions for printing out variables and debugging Python code.printdidn't give enough information while debugging,pprintwasn't much better. I was also getting sick of typing things like:print("var = ", var).Pout tries to print out variables with their name, and for good measure, it also prints where thepoutfunction was called so you can easily find it and delete it when you're done debugging.I use pout extensively in basically every python project I work on.Methodspout.v(arg1, [arg2, ...]) -- easy way to print variablesexamplefoo=1pout.v(foo)bar=[1,2,[3,4],5]pout.v(bar)should print something like:foo = 1
(/file.py:line)

bar (4) =
[
        0: 1,
        1: 2,
        2:
                [
                        0: 3,
                        1: 4
                ],
        3: 5
]
(/file.py:line)You can send as many variables as you want into the call# pass in as many variables as you wantpout.v(foo,bar,che)# a multi-line call is also finepout.v(foo,bar)pout.h() -- easy way to print "here" in the codeexamplepout.h(1)# do something elsepout.h(2)# do even more of something elsepout.h()Should print something like:here 1 (/file.py:line)

here 2 (/file.py:line)

here N (/file.py:N)pout.t() -- print a backtracePrints a nicely formatted backtrace, by default this should compact system python calls (eg, anything in dist-packages) which makes the backtrace easier for me to follow.example:pout.t()should print something like:15 - C:\Python27\lib\runpy.py:162
14 - C:\Python27\lib\runpy.py:72
13 - C:\Python27\lib\unittest\__main__.py:12
12 - C:\Python27\lib\unittest\main.py:95
11 - C:\Python27\lib\unittest\main.py:229
10 - C:\Python27\lib\unittest\runner.py:151
09 - C:\Python27\lib\unittest\suite.py:65
08 - C:\Python27\lib\unittest\suite.py:103
07 - C:\Python27\lib\unittest\suite.py:65
06 - C:\Python27\lib\unittest\suite.py:103
05 - C:\Python27\lib\unittest\suite.py:65
04 - C:\Python27\lib\unittest\suite.py:103
03 - C:\Python27\lib\unittest\case.py:376
02 - C:\Python27\lib\unittest\case.py:318
01 - C:\Projects\Pout\_pout\src\test_pout.py:50

        pout.t()pout.p([title]) -- quick and dirty profilingexamplep("starting profile")time.sleep(1)p()# stop the "starting profile" session# you can go N levels deepp("one")p("two")time.sleep(0.5)p()# stop profiling of "two"time.sleep(0.5)p()# stop profiling of "one"# you can also use withwithp("benchmarking"):time.sleep(0.5)should print something like:starting profile - 1008.2 ms
  start: 1368137723.7 (/file/path:n)
  stop: 1368137724.71(/file/path:n)


one > two - 509.2 ms
  start: 1368137722.69 (/file/path:n)
  stop: 1368137723.2(/file/path:n)


one - 1025.9 ms
  start: 1368137722.68 (/file/path:n)
  stop: 1368137723.7(/file/path:n)pout.x(arg1, [arg2, ...]) -- like pout.v but then will run sys.exit(1)This just prints out where it was called from, so you can remember where you exited the code while debuggingexample:pout.x()will print something like this before exiting with an exit code of 1:exit(/file/path:n)pout.b([title[, rows[, sep]]]) -- prints lots of lines to break up outputThis is is handy if you are printing lots of stuff in a loop and you want to break up the output into sections.example:pout.b()pout.b('this is the title')pout.b('this is the title 2',5)pout.b('this is the title 3',3,'=')Would result in output like:********************************************************************************
(/file/path:n)


****************************** this is the title *******************************
(/file/path:n)


********************************************************************************
********************************************************************************
***************************** this is the title 2 ******************************
********************************************************************************
********************************************************************************
(/file/path:n)


================================================================================
============================= this is the title 3 ==============================
===============================================================================
(/file/path:n)pout.c(str1, [str2, ...]) -- print info about each char in each strKind of likeod -con the command line.example:pout.c('this')will print something like:Total Characters: 4
t	't'	\u0074	LATIN SMALL LETTER T
h	'h'	\u0068	LATIN SMALL LETTER H
i	'i'	\u0069	LATIN SMALL LETTER I
s	's'	\u0073	LATIN SMALL LETTER S
(/file/path:n)This could fail if Python isn't compiled with 4 byte unicode support, just something to be aware of, but chances are, if you don't have 4 byte unicode supported Python, you're not doing much with 4 byte unicode.pout.s(arg1, [arg2, ...]) -- easy way to return pretty versions of variablesJust likepout.v()but will return the value as a stringpout.ss(arg1, [arg2, ...]) -- easy way to return pretty versions of variables without meta informationJust likepout.vv()but will return the value as a stringpout.l([logger_name, [logger_level]]) -- turn logging on just for this contextTurns logging on for the given level (defaults tologging.DEBUG) and prints the logs tostderr. Useful when you just want to check the logs of something without modifying your current logging configuration.example:withpout.l():logger.debug("This will print to the screen even if logging is off")logger.debug("this will not print if logging is off")withpout.l("name"):# if "name" logger is used it will print to stderr# "name" logger goes back to previous configurationpout.tofile([path])Routes pout's output to a file (defaults to./pout.txt)example:withpout.tofile():# everything in this with block will print to a file in current directorypout.b()s="foo"pout.v(s)pout.s()# this will print to stderrCustomizing Poutobject magic methodAny class object can define a__pout__magic method, similar to Python's built in__str__magic method that can return a customized string of the object if you want to. This method can return anything, it will be run through Pout's internal stringify methods to convert it to a string and print it out.Console commandspout jsonrunning a command on the command line that outputs a whole a bunch of json? Pout can help:$ some-command-that-outputs-json | pout jsonpout charRunspout.cbut on the output from a command line script:$ echo "some string with chars to analyze" | pout charInstallUse PIPpip install poutGenerally, the pypi version and the github version shouldn't be that out of sync, but just in case, you can install from github also:pip install -U "git+https://github.com/Jaymon/pout#egg=pout"Make Pout easier to useWhen debugging, it's really nice not having to putimport poutat the top of every module you want to use it in, so there's a command for that, if you put:importpoutpout.inject()Somewhere near the top of your application startup script, thenpoutwill be available in all your files whether you imported it or not, it will be just likestr,object, or the rest of python's standard library.If you don't even want to bother with doing that, then just run:$ pout injectfrom the command line and it will modify your python environment to make pout available as a builtin module, just like the python standard library. This is super handy for development virtual environments.