为了完整起见,我添加了这个。我惊讶地发现没有看到这种方法。
from argparse import Action, ArgumentParser
class CommaSeparatedListAction(Action):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values.split(','))
parser = ArgumentParser()
parser.add_argument('-l', action=CommaSeparatedListAction)
print(parser.parse_args('-l a,b,c,d'.split()))
这只是一个基本的例子,但您还可以添加验证或以某种方式转换值,例如强制将它们转换为大写。
from argparse import Action, ArgumentParser
class UppercaseLetterCommaSeparatedListAction(Action):
def __call__(self, parser, namespace, values, option_string=None):
letters = values.split(',')
for l in letters:
self._validate_letter(parser, l)
setattr(
namespace,
self.dest,
list(map(lambda v: v.upper(), letters))
)
def _validate_letter(self, parser, letter):
if len(letter) > 1 or not letter.isalpha():
parser.error('l must be a comma separated list of letters')
parser = ArgumentParser()
parser.add_argument('-l', action=UppercaseLetterCommaSeparatedListAction)
print(parser.parse_args('-l a,b,c,d'.split()))
parser = ArgumentParser()
parser.add_argument('-l', action=UppercaseLetterCommaSeparatedListAction)
print(parser.parse_args('-l a,bb,c,d'.split()))
parser = ArgumentParser()
parser.add_argument('-l', action=UppercaseLetterCommaSeparatedListAction)
print(parser.parse_args('-l a,1,c,d'.split()))
argparse
将把它们视为一个参数。 - Katrielnargs="+"
会改变这种行为,因此它将-a 1 2 3
作为一个列表处理。 - Jakub M.