python / cpython

The Python programming language
https://www.python.org
Other
63.55k stars 30.45k forks source link

argparse: document that add_argument returns a Action object #69223

Open 917acfef-b076-4032-9ba6-f271eefe6fc3 opened 9 years ago

917acfef-b076-4032-9ba6-f271eefe6fc3 commented 9 years ago
BPO 25035
Nosy @bitdancer

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'] ```

917acfef-b076-4032-9ba6-f271eefe6fc3 commented 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.

bitdancer commented 9 years ago

Can you provide some specific use cases, please?

917acfef-b076-4032-9ba6-f271eefe6fc3 commented 9 years ago

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.

7a064fe6-c535-4d80-a11f-a04ed39056c5 commented 9 years ago

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'.

917acfef-b076-4032-9ba6-f271eefe6fc3 commented 9 years ago

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.

7a064fe6-c535-4d80-a11f-a04ed39056c5 commented 9 years ago

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.

917acfef-b076-4032-9ba6-f271eefe6fc3 commented 9 years ago

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?

7a064fe6-c535-4d80-a11f-a04ed39056c5 commented 7 years ago

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.

hadrizi commented 1 year ago

@iritkatriel is this issue still relevant? looking for a first issue

afaics this is still not documented

iritkatriel commented 1 year ago

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.