Jason R. Coombs <[email protected]> added the comment:
Most of the Action subclasses in argparse override __init__ and they raise
ValueErrors when the parameters aren't as expected for that argument. This was
my reason for adding that comment. If the basic Actions require this level of
validation, wouldn't a custom action also want to supply this type of behavior?
I'm sure I've overridden Action.__init__ in some of the subclasses I've
created, but I don't remember specifically why.
I agree freezing the __init__ signature is undesirable. It would be preferable
if the API called a hook for validating the argument parameters against the
action. My intention, however, was to document the existing behavior, not
influence changes in the behavior.
Perhaps the recommended API really isn't to subclass Action, but to supply a
callable that takes the __init__ args which validates the parameters and
returns a callable which takes the __call__ args which should set attributes on
the namespace. Perhaps the Action class is only one such implementation of the
API. Indeed, that was my understanding of the API as it is currently documented
before Terry suggested otherwise.
What do you think about instead of documenting the Action class, we formalize
the API, similar to how I described it in the previous paragraph, and then
suggest that an Action subclass with an overridden __call__ is the most direct
way to implement the Action API?
In reviewing the code again, I note that not just most, but all of the Action
subclasses override __init__. I also note that not all of them accept the same
parameters. For example, the _StoreConstAction does not accept an nargs
parameter.
>>> p = argparse.ArgumentParser()
>>> p.add_argument('--awesome-sauce', action="store_const", const=True,
>>> nargs=None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\python\lib\argparse.py", line 1281, in add_argument
action = action_class(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'nargs'
So it seems that the Action API is slightly different than I described. The
first callable should accept all of the parameters passed to add_argument
_except_ for the action parameter itself. I think by indicating this in the API
description, we avoid the problem of freezing any additional signature.
I'll take another stab at updating the documentation with these findings.
----------
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue13540>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com