Last active
October 22, 2019 17:35
-
-
Save alexomics/f0e9796a6e140faee7445791880f9a5c to your computer and use it in GitHub Desktop.
A quick argparse for scripts that share options
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse | |
DEFAULT_SERVER_HOST = "127.0.0.1" | |
DEFAULT_SERVER_PORT = 5555 | |
DEFAULT_TIMEOUT = 500 | |
BASE_ARGS = ( | |
( | |
"Inputs", # GROUP | |
"-H", # FLAG | |
"--host", # FLAG | |
dict( # OPTIONS | |
metavar="HOST", | |
help="Server host address (default: {})".format( | |
DEFAULT_SERVER_HOST | |
), | |
default=DEFAULT_SERVER_HOST, | |
), | |
), | |
( | |
"Inputs", | |
"-P", | |
"--port", | |
dict( | |
metavar="PORT", | |
help="Server port (default: {})".format(DEFAULT_SERVER_PORT), | |
default=DEFAULT_SERVER_PORT, | |
), | |
), | |
( | |
"Outputs", | |
"-o", | |
dict(metavar="OUTPUT", type=str, help="Output filename", required=True), | |
), | |
( | |
"", # No group | |
"--timeout", | |
dict( | |
metavar="TIMEOUT", | |
type=int, | |
help="Connection timeout in seconds (default: {})".format( | |
DEFAULT_TIMEOUT | |
), | |
default=DEFAULT_TIMEOUT, | |
), | |
), | |
) | |
def get_args(default_args=None, extra_args=None, prog=""): | |
if default_args is None: | |
args = BASE_ARGS | |
else: | |
args = default_args | |
if extra_args is not None: | |
args = args + extra_args | |
parser = argparse.ArgumentParser(prog) | |
groups = {g: parser.add_argument_group(g) for g, *_ in args if g} | |
for group, *flags, opts in args: | |
if group in groups: | |
groups.get(group).add_argument(*flags, **opts) | |
else: | |
parser.add_argument(*flags, **opts) | |
return parser, parser.parse_args() | |
def main(): | |
extra_args = ( | |
( | |
"", | |
"--log-file", | |
dict( | |
metavar="LOG-FILE", | |
help="File to write logs to", | |
), | |
), | |
) | |
parser, args = get_args(extra_args=extra_args, prog="My script") | |
print(args) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment