mujoco_worldgen/util/parse_arguments.py (71 lines of code) (raw):
import glob
import os
from mujoco_worldgen.parser.normalize import normalize_value
def parse_arguments(argv):
'''
Takes list of arguments and splits them
to argument that are of form key=value, and dictionary.
Furhter, cleans arguments (expands *, ~), and
makes sure that they refer to files, then files
are local.
'''
assert len(argv) >= 1, "At least one argument expected."
argv = _expand_user_rewrite(argv)
argv = _expand_wildcard_rewrite(argv)
argv, kwargs = _extract_kwargs_rewrite(argv)
_eval_kwargs(kwargs)
names = argv
print("\nInferred:")
print("\tnames: %s" % " ".join(names))
print("\targuments: %s" % str(kwargs))
print("\n")
return names, kwargs
def _expand_wildcard_rewrite(argv):
'''
:param argv: list of values
:return: If arguments contains *, than try to expand it to all fitting files.
'''
ret = []
for arg in argv:
if "*" in arg:
new_name = glob.glob(arg)
assert len(new_name) > 0, "Couldn't find any expansion to the pattern \"%s\"" % arg
ret += new_name
else:
ret.append(arg)
return ret
def _expand_user_rewrite(argv):
'''
:param argv: list of values
:return: values after the rewrite. If value contains ~ then it's expanded to home directory.
'''
ret = []
for arg in argv:
if arg[0] == "~":
arg = os.path.expanduser(arg)
ret.append(arg)
return ret
def _extract_kwargs_rewrite(argv):
'''
Splits list into dictionary like arguments and remaining arguments.
:param argv: list of values
:return: arguments that doesnt look like key=value, and dictionary with remaining arguments.
'''
kwargs = {}
ret = []
for arg in argv:
if arg.find("=") > -1:
pos = arg.find("=")
key, value = arg[:pos], arg[pos+1:]
kwargs[key] = normalize_value(value)
else:
ret.append(arg)
return ret, kwargs
def _eval_kwargs(kwargs):
'''
Evaluates values which are strings starting with `@`, e.g. "@[]" -> [].
:param kwargs: dictionary
:return: the same dictionary but with evaluated values
'''
for key, value in kwargs.items():
if isinstance(value, str) and value[0] == '@':
kwargs[key] = eval(value[1:])