Open 917acfef-b076-4032-9ba6-f271eefe6fc3 opened 9 years ago
On making a look at the argparse documentation to figure out if I can get the value of the choices key of a specific argument after argument parsing or if I have to implement it myself I noticed that there is a getter/setter for the default key (ArgumentParser.get_default and ArgumentParser.set_defaults) but not for the other keys. Maybe this could also be implemented for the other keys, probably as a generic function that takes as an extra argument the requested key.
Can you provide some specific use cases, please?
I was myself in the case where I needed the values of the choices key of 2 specific arguments. Currently I'm solving this by storing them in variables but probably it could be cleaner by using a getter.
parser.set_defaults
lets you set a default for any dest
. It does not have to be connected with an argument. See what the docs say about using it to set an action linked to a subparser.
arg1 = parser.add_argument(...)
returns an Action
object. The parser collects these objects in its lists, but you can also save a reference to it yourself.
I'd suggest doing this in an interactive shell, and see for yourself the attributes of this object. Simply doing a 'print' on the object shows a number of the attributes (but not all). It is possible to view, and in some cases, even modify these attributes directly.
args.choices
gives you access to the choices
attribute.
I don't think there's a need for getter/setter methods for Action attributes. The attributes are accessible by normal Python object approaches.
p.s. Another forum for asking argparse how-to questions is Stackoverflow. Just tag it 'argparse'.
I'm actually not fully sure why you are telling me this all, especially in this specific way.
But I would also go the other way, by removing ArgumentParser.get_default and ArgumentParser.set_defaults if we think the current ways of getting/setting are enough. Mainly I think consistence is the important here.
get_default
and set_defaults
are parser methods, and do more than set or get a particular Action attribute. 'Set' for example changes both the 'parser._defaults' attribute, and a 'action.default' attribute. Defaults are complex and can be defined in at least 3 different ways.
'choices' (and other things like 'required', 'nargs', even 'default') is an attribute of a specific Action (argument object). You normally only set these in one way, as parameters of the add_argument
method.
'action.default' and 'action.choices' are 'public' attributes. 'parser._defaults' is a 'private' attribute. A setter method is the right way to change a 'private' attribute (if needed). It usually isn't need for a 'public' one.
In this case probably all is fine then. But there is a minor thing I noticed from one of your previous posts: You said parser.add_argument returns an Action object but I noticed that this is not mentioned on "16.4.3. The add_argument() method". Is it maybe mentioned somewhere else or probably just missing?
Yes, the information that add_argument
returns a Action object is missing from the documentation. It might be useful addition.
The documentation has many faults. It isn't basic enough to be a tutorial, but many first time users use it as such, and get confused by its complexity. But it also is not a formal reference document. And the automatic 'help(argparse)' isn't much better.
A regular user does not need to use the Action object directly. But as a developer I often test argparse in an interactive shell (IPython), and the 'out' line shows a 'str' of the object (as a summary of its attributes). So assigning that object to a variable is just as natural to me as saving the parser object returned by argparse.ArgumentParser, or the group object returned by parser.add_argument_group.
@iritkatriel is this issue still relevant? looking for a first issue
This is probably not a good first issue because the argparse docs need a deeper review and we don’t have an active maintainer at the moment working on that. I will remove the easy label.
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields: ```python assignee = None closed_at = None created_at =
labels = ['type-feature', '3.7', 'docs']
title = 'Getter/setter for argparse keys'
updated_at =
user = 'https://bugs.python.org/Sworddragon'
```
bugs.python.org fields:
```python
activity =
actor = 'rhettinger'
assignee = 'docs@python'
closed = False
closed_date = None
closer = None
components = ['Documentation']
creation =
creator = 'Sworddragon'
dependencies = []
files = []
hgrepos = []
issue_num = 25035
keywords = []
message_count = 8.0
messages = ['250263', '250305', '250330', '250350', '250352', '250353', '250423', '282878']
nosy_count = 5.0
nosy_names = ['bethard', 'r.david.murray', 'docs@python', 'Sworddragon', 'paul.j3']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = 'enhancement'
url = 'https://bugs.python.org/issue25035'
versions = ['Python 3.7']
```