python - How to access argparse key name instead of value? -
a callee.py has namespace using argparse:
parser = namespace(action='run', action_area='park', severity='high')  in [30]: parser.action out[30]: 'run'   if type in command line, should enough:
callee.py --run --action_area gym --severity low   if call inside program caller.py, this:
callee.py sth.run sth.action_area 'gym' sth.severity 'low'   the advantages are:   more regulated   easier update if args in callee.py change
i wish sth came argparse or not have code myself.
i build sth this:
class parserkeys(object):     def __init__(self, keys):         self.keys = keys         key in keys:             setattr(self, key, '--{0}'.format(key))  sth = parserkeys(vars(parser).keys())  in [91]: sth.action out[91]: '--action'   my question is: there way inside argparse or other ways not have build class this?
this example explain requirements, how achieve not limited argparse if feature not available(i assume should).
i sure not first , last 1 requires feature. hope explain time.
the usual way use argparse define parser, populate 'arguments', , call parse_args() parse command line.
parse_args() returns namespace object use.
it possible define namespace object directly:
in [203]: ns = argparse.namespace(x=12, y='abc') in [204]: ns out[204]: namespace(x=12, y='abc') in [205]: ns.x out[205]: 12 in [206]: nx.z .... nameerror: name 'nx' not defined in [207]: ns.z = [1,2,3] in [208]: ns out[208]: namespace(x=12, y='abc', z=[1, 2, 3])   you can add values existing object, can't access values aren't defined. namespace class simple, adding few methods make display of values prettier.
you can dictionary it:
in [209]: vars(ns) out[209]: {'x': 12, 'y': 'abc', 'z': [1, 2, 3]}  in [210]: list(vars(ns).keys()) out[210]: ['z', 'y', 'x']   fetching value using key string:
in [212]: getattr(ns,'x') out[212]: 12   you can set attributes name
in [220]: setattr(ns,'w','other') in [221]: ns out[221]: namespace(w='other', x=12, y='abc', z=[1, 2, 3])   the method ns uses display values is:
def __repr__(self):     type_name = type(self).__name__     arg_strings = []     arg in self._get_args():         arg_strings.append(repr(arg))     name, value in self._get_kwargs():         arg_strings.append('%s=%r' % (name, value))     return '%s(%s)' % (type_name, ', '.join(arg_strings))  def _get_kwargs(self):     return sorted(self.__dict__.items())   self.__dict__ same thing vars(ns) gives. attributes stored in dictionary (as true objects, user defined ones).
if want more namespace, or define own class, i'd suggest looking @ class in argparse.py file.   argparse tries make minimal assumptions nature of class.  possible uses getattr , setattr functions.  , hasattr well:
in [222]: hasattr(ns, 'foo') out[222]: false in [223]: hasattr(ns, 'w') out[223]: true   from edits sounds want 'recover' option flag attribute names in namespace. is
 parser.add_argument('--foo', '-f', ...)  parser.add_argument('bar', ...)  parser.add_argument('--other', dest='baz',...)   will produce namespace(foo=..., bar=....)
the attribute name called dest.  when saving values parser uses
 setattr(namespace, dest, value)   for positional argument dest 1st parameter, 'bar' in above example.  optional argument, dest derived first long parameter, '--foo' above.  or may set explicit dest='baz' parameter.
so adding -- ns.__dict__ key start.  
there isn't code in argparse can recreate commandline parsing results.
Comments
Post a Comment