Python修改类内属性的方法

背景说明

项目中用到了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))

猜你喜欢

转载自blog.csdn.net/u012101384/article/details/129961100