[Python-Dev] PEP 389: argparse - new command line parsing module
Steven D'Aprano
steve at pearwood.info
Sun Oct 4 03:26:51 CEST 2009
On Sun, 4 Oct 2009 05:35:04 am André Malo wrote:
> * Steven D'Aprano wrote:
> > You don't need a comment warning that you are catching SystemExit
> > because parse_args raises SystemExit, any more than you need a
> > comment saying that you are catching ValueError because some
> > function raises ValueError. The fact that you are catching an
> > exception implies that the function might raise that exception. A
> > comment like:
> >
> > "Catching SystemExit because parse_args() throws SystemExit on
> > parser errors."
> >
> > is up them with comments like this:
> >
> > x += 1 # Add 1 to x.
>
> It's semantically different. You usually don't catch SystemExit
> directly, because you want your programs to be stopped.
Exactly -- so why catch it at all? But even if there is a good reason to
catch it, there's still no reason to subclass SystemExit unless
argparse wants to distinguish different types of fatal error, and allow
code to catch some but not all. But frankly, if I'm having a hard time
thinking of a reason to catch SystemExit, I'm having an even harder
time thinking why you'd want to (say) catch SystemExitTooManyArguments
but not SystemExitMissingArgument.
> Additionally,
> a library exiting your program is badly designed, as it's unexpected.
It's not unexpected for an argument parser. Do you know any applications
that run when given invalid arguments? As a general rule, what can the
application do? Guess what you wanted?
> Thatswhy such a comment is useful.
The comment doesn't tell you anything that wasn't obvious from the code.
It is pointless.
> Here's what I'd do: I'd subclass SystemExit in this case and raise
> the subclass from argparse.
In the following code snippet:
try:
ns = argparse.parse_args()
except SystemExit:
...
is there any confusion between SystemExit raised by parse_args and
SystemExit raised by other components? *What* other components? If
SystemExit was raised in that try block, where could it have come from
other than parse_args?
Do you write comments like these?
try:
value = mydict[key]
except KeyError:
# Catch KeyError raised by dict lookup
...
try:
n = mylist.index(x)
except ValueError:
# Catch ValueError raised by mylist.index
...
Useless comments are worse than no comments, because useless comments
waste the readers' time and they risk becoming out of sync with the
code and turning into misleading comments.
> That way all parties here should be satisifed.
No. It wastes the time of the argparse developer, it wastes the time of
people learning argparse, it wastes the time of people who read the
code and wonder what's the difference between SystemExit and
ArgparseSystemExit. (Answer: there is no difference.)
--
Steven D'Aprano
More information about the Python-Dev
mailing list