Pythonic implementation of quiet / verbose flag for functions
--
Music by Eric Matyas
https://www.soundimage.org
Track title: Hypnotic Puzzle3
--
Chapters
00:00 Question
00:52 Accepted answer (Score 8)
01:24 Answer 2 (Score 10)
02:55 Answer 3 (Score 0)
03:09 Thank you
--
Full question
https://stackoverflow.com/questions/4147...
Accepted answer links:
[logging]: https://docs.python.org/2/library/loggin...
[more options there]: https://docs.python.org/2/howto/logging....
Answer 2 links:
[PEP 8, Other Recommendations]: https://www.python.org/dev/peps/pep-0008...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #variables #pep8
#avk47
ANSWER 1
Score 10
If you don't want to rely on a logging library, I think your solution is already pythonic enough. It may be a little bit more pythonic to write:
def simple_addition(a, b, silent=True):
    res = a + b
    if not silent:
        print('The answer is %i' % res)
    return res
As stated in PEP 8, Other Recommendations, single-line if statements are okay, but discouraged.
There are other possibilities.
Using or
Using the or operator to encode a condition is arguably not pythonic
but personally I think it reads nice: "silent or...", "quiet or...".  See below:
def simple_addition(a, b, silent=True):
    res = a + b
    silent or print('The answer is %i' % res)
    return res
The or operator does short-circuit, so print and its arguments are only evaluated when silent is False like when using an if statement.
A disadvantage is that mypy type checking will fail if silent is bound to a boolean type:
$ cat > add.py
def simple_addition(a, b, silent: bool = True):
    res = a + b
    silent or print('The answer is %i' % res)
    return res
^D
$ mypy add.py
add.py:3: error: "print" does not return a value
noop ternary
We could also do this:
def noop(*args, **kwargs):
    pass
def simple_addition(a, b, silent=True):
    _print = noop if silent else print
    res = a + b 
    _print('The answer is %i' % res)
    return res
...but it feels rather unpythonic.
ACCEPTED ANSWER
Score 8
Basically you can use the logging module which gives you the ability to set the Level of logging you want, and the logger will save/print/export (based on your config) the logged values.
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
You can set the level of your logger using:
logging.basicConfig(level=logging.INFO)
And there are many more options there.
ANSWER 3
Score 0
I have tended to go with:
def simple_addition(a, b, verbose=True):
    res = a + b
    print('The answer is %i' % res) if verbose else None 
    return res