背景说明
项目中用到了argparse
模块进项参数解析,但在解析时,当参数值必须用双引号进项包围传递,这时参数值中的两头的双引号便会影响程序执行,导致结果错误。
argparse
模块解析后,参数与值是存放在NameSpace
中的,使用.
进行调用,因而无法用for直接遍历修改。且实际情况下具有多个参数,分别处理太麻烦,于是可以解析后就进项处理。
几个搜索引擎试了下都没搜到怎么处理,于是看了下parse_known_args
源码,模仿着写了下,结果正确。其他时候也可能遇到这种需要修改类内属性值的情况,于是记录一下。
实现
import argparse
import sys
args = sys.argv[1:]
# args = ['--echo','"hello world"']
parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('--echo', type=str, default='', help='输出信息')
parsed, unparsed = parser.parse_known_args(args=args)
parsed_attr = parsed.__dict__
for attr in parsed_attr:
value = parsed_attr[attr]
if isinstance(attr, str):
setattr(parsed, attr, str(value).strip('"'))
print(parsed)
parse_known_args
源码
def parse_known_args(self, args=None, namespace=None):
if args is None:
# args default to the system args
args = _sys.argv[1:]
else:
# make sure that args are mutable
args = list(args)
# default Namespace built from parser defaults
if namespace is None:
namespace = Namespace()
# add any action defaults that aren't present
for action in self._actions:
if action.dest is not SUPPRESS:
if not hasattr(namespace, action.dest):
if action.default is not SUPPRESS:
setattr(namespace, action.dest, action.default)
# add any parser defaults that aren't present
for dest in self._defaults:
if not hasattr(namespace, dest):
setattr(namespace, dest, self._defaults[dest])
# parse the arguments and exit if there are any errors
try:
namespace, args = self._parse_known_args(args, namespace)
if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
return namespace, args
except ArgumentError:
err = _sys.exc_info()[1]
self.error(str(err))