Python argparse:强制列表项唯一

Del*_*ted 3 python argparse

能够使用choices=servers下面的方法来验证列表项是很好的。

servers = [ "ApaServer", "BananServer", "GulServer", "SolServer", "RymdServer", "SkeppServer", "HavsServer", "SovServer" ]
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--only', nargs='*', choices=servers, help='Space separated list of case sensitive server names to process')
Run Code Online (Sandbox Code Playgroud)

是否可以强制列表中的项目是唯一的,从而不允许重复?

jco*_*ado 5

正确使用丢弃重复项的方法argparse是创建自己的argparse.Action类,该类将set按照其他答案的建议进行使用:

import argparse

class UniqueAppendAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        unique_values = set(values)
        setattr(namespace, self.dest, unique_values)

servers = ["ApaServer", "BananServer", "GulServer", "SolServer",
           "RymdServer", "SkeppServer", "HavsServer", "SovServer" ]
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--only', nargs='*', choices=servers, action=UniqueAppendAction,
                    help='Space separated list of case sensitive server names to process')
print parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

输出示例:

$ python test.py -o ApaServer ApaServer
Namespace(only=set(['ApaServer']))
Run Code Online (Sandbox Code Playgroud)

  • 在args = parser.parse_args()之后,我看不到简单的args.only = set(args.only)上的任何值。比编写自定义动作要短得多... (5认同)
  • 在这种情况下,您仍然可以对arg in('only1','only2'):setattr(args,arg,set(getattr(args,arg))))执行操作。但是我明白你的意思了... (2认同)