My suggestion is to use a function. But rather than putting the if
in the function, which you might be tempted to do, do it like this:
if verbose:
def verboseprint(*args):
# Print each argument separately so caller doesn't need to
# stuff everything to be printed into a single string
for arg in args:
print arg,
print
else:
verboseprint = lambda *a: None # do-nothing function
(Yes, you can define a function in an if
statement, and it'll only get defined if the condition is true!)
If you're using Python 3, where print
is already a function (or if you're willing to use print
as a function in 2.x using from __future__ import print_function
) it's even simpler:
verboseprint = print if verbose else lambda *a, **k: None
This way, the function is defined as a do-nothing if verbose mode is off (using a lambda), instead of constantly testing the verbose
flag.
If the user could change the verbosity mode during the run of your program, this would be the wrong approach (you'd need the if
in the function), but since you're setting it with a command-line flag, you only need to make the decision once.
You then use e.g. verboseprint("look at all my verbosity!", object(), 3)
whenever you want to print a "verbose" message.
If you are willing and able to use the Python -O
flag to turn verbosity on and off when launching the "production" version of the script (or set the PYTHONOPTIMIZE
environment variable) then the better way is to test the __debug__
flag everywhere you want to print a verbose output:
if __debug__: print("Verbosity enabled")
When run without optimization, these statements are executed (and the if
is stripped out, leaving only the body of the statement). When run with optimization, Python actually strips those statements out entirely. They have no performance impact whatsoever! See my blog post on __debug__
and -O
for a more in-depth discussion.