Skip to content

Instantly share code, notes, and snippets.

@alexomics
Last active October 22, 2019 17:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexomics/f0e9796a6e140faee7445791880f9a5c to your computer and use it in GitHub Desktop.
Save alexomics/f0e9796a6e140faee7445791880f9a5c to your computer and use it in GitHub Desktop.
A quick argparse for scripts that share options
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