Re: argsparse: allowing --version without mandatory options

"Jonathan N. Little via Python-list" <[email protected]>
Newsgroups gmane.comp.python.general
Organization LITTLE WORKS STUDIO
Message-ID <[email protected]>
Loris Bennett wrote:
> "Loris Bennett" <[email protected]> writes:
> 
>> Hi,
>>
>> I am writing a program for the command-line which uses 'argsparse'.  I
>> want to make some options mandatory by setting 'required=True', but
>> still allow the program to run with the option '--version' (which just
>> shows the version and then exits) even if the mandatory options are
>> missing.
>>
>> Is there a standard way of doing this?
> 
> I see that instead of setting required to 'True' I can use an expression
> which checks whether '--version' has been given:


What I do is separate it into two functions. First function that sets up
the parser object and returns the parser object:

def make_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser( ... )
    ...
    return parser

The code is similar to yours below, but for version my action references
an f string variable:

parser.add_argument(
    "-v", "--version",  action="version",
    version=f"{APP_NAME} v{__version__}"
)


I typically have the optional args set to a default value, null string
or None. Then the second function which my main() calls this function
which returns a tuple of arg values here is one example:

def get_program_args() -> tuple:
    parser = make_parser()
    args = parser.parse_args()
    return args.action, args.profile, args.log_level

def main():
    # parser args
    action, profile_name, log_level = get_program_args()
    ...

Works for me.



>     parser.add_argument(
>         "uid", nargs="+",
>         help="UIDs to send mail to"
>     )
>     parser.add_argument(
>         '-s', '--subject', dest='subject', required=not '--version' in sys.argv,
>         help="subject of email"
>     )
>     parser.add_argument(
>         '-c', '--content_file', dest='content_file', required=not '--version' in sys.argv,
>         help="file containing mail contents (without salutation or signature)"
>     )
>     parser.add_argument(
>         '--version', action='store_true', dest='version',
>         help="print version"
> 
> However, with the above, I still need to specify the mandatory argument,
> even if I only want to see the version.
> 
> I guess I'll just have to change 
> 
>   nargs="+" 
> 
> to 
> 
>   nargs="*"
> 
> and check explicitly whether any arguments have been given.
> 
> Seems odd to me though that there is not a standard way of implementing
> '--version' which works like '--help' does.
> 
> Cheers,
> 
> Loris
> 


-- 
Take care,

Jonathan
-------------------
LITTLE WORKS STUDIO
http://www.LittleWorksStudio.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.