Path: csiph.com!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: "Jonathan N. Little" Newsgroups: comp.lang.python Subject: Re: argsparse: allowing --version without mandatory options Date: Mon, 3 Nov 2025 22:19:45 -0500 Organization: LITTLE WORKS STUDIO Lines: 97 Message-ID: <10ebrci$3c3cn$1@dont-email.me> References: <87bjlod7g3.fsf@zedat.fu-berlin.de> <87pla4bljx.fsf@zedat.fu-berlin.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Injection-Date: Tue, 04 Nov 2025 03:19:47 +0000 (UTC) Injection-Info: dont-email.me; posting-host="a5a290ed95bdeb6fca5aaefe60160049"; logging-data="3542423"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+vxGq3HN+LvWuowxT1e9+mk2S7VbTf8Xc=" User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 SeaMonkey/2.53.21 Cancel-Lock: sha1:CQnQBBURyDf6K23+VBzWYMJwI84= In-Reply-To: <87pla4bljx.fsf@zedat.fu-berlin.de> X-Face: o[H8T0h*NGH`K`P)s+4PmYlcy|GNl`~+L6Fi.m:%15m[c%{C7V-ump|WiCYPkQ+hFJhq;XW5^1Rg_El'"fE$~AcYW$Pq\yeh9K_-dJqlQ5\y2\;[yw5DYCtOtsf_.TUy}0U\oL^>[3Y#{AP2^o'bG`bwj`]]UNpCxY\(~xK9b+uZKxrb*4-rkD+ X-Dan: Yes Dan this is a Winbox Xref: csiph.com comp.lang.python:197578 Loris Bennett wrote: > "Loris Bennett" 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