Skip to content

Instantly share code, notes, and snippets.

@podhmo
Last active November 7, 2015 09:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save podhmo/3ee7f41bf06bbcaa80f1 to your computer and use it in GitHub Desktop.
Save podhmo/3ee7f41bf06bbcaa80f1 to your computer and use it in GitHub Desktop.
# -*- coding:utf-8 -*-
import argparse
class MixiedArgs(object):
def __init__(self, args, defaults):
self.args = args
self.defaults = defaults
def __getattr__(self, k):
return getattr(self.args, k, None) or getattr(self.defaults, k)
class ObjectLikeDict(dict):
__getattr__ = dict.get
class LoadJSONConfigAction(argparse.Action):
def __call__(self, parser, namespace, val, option_string=None):
import json
if val.startswith("file://"):
with open(val.lstrip("file://")) as rf:
data = json.load(rf, object_pairs_hook=ObjectLikeDict)
else:
data = json.loads(val, object_pairs_hook=ObjectLikeDict)
setattr(namespace, self.dest, data)
def make_parser():
parser = argparse.ArgumentParser()
parser.add_argument("--name")
parser.add_argument("--message")
parser.add_argument("--profile", action=LoadJSONConfigAction)
return parser
if __name__ == "__main__":
def run(args):
print(args.message.format(name=args.name))
parser = make_parser()
class DefaultConfig:
name = "foo"
message = "{name}: hai"
args = parser.parse_args(["--message", "{name}: hello"])
run(MixiedArgs(args, DefaultConfig))
args = parser.parse_args(["--message", "{name}: bye", "--profile", '{"name": "bar"}'])
run(MixiedArgs(args, args.profile))
args = parser.parse_args(["--profile=file://profile.json"])
run(MixiedArgs(args, args.profile))
{
"name": "this-is-my-name",
"message": "<message sender=\"{name}\">hello</message>"
}
@podhmo
Copy link
Author

podhmo commented Nov 7, 2015

foo: hello
bar: bye
<message sender="this-is-my-name">hello</message>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment