Passing integer lists to python

后端 未结 6 732
感情败类
感情败类 2021-01-07 19:23

I want to pass 2 lists of integers as input to a python program.

For e.g, (from command line)

python test.py --a 1 2 3 4 5 -b 1 2  
6条回答
  •  無奈伤痛
    2021-01-07 20:00

    Just adding this one for completeness. I was surprised that I didn't see this approach.

    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()))
    
    # Namespace(l=['a', 'b', 'c', 'd'])
    

    This just a basic example, but you can also add validation or transform values in someway such as coercing them to uppercase.

    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()))
    
    # Namespace(l=['A', 'B', 'C', 'D'])
    
    parser = ArgumentParser()
    parser.add_argument('-l', action=UppercaseLetterCommaSeparatedListAction)
    print(parser.parse_args('-l a,bb,c,d'.split()))
    
    # usage: list.py [-h] [-l L]
    # list.py: error: l must be a comma separated list of letters
    
    parser = ArgumentParser()
    parser.add_argument('-l', action=UppercaseLetterCommaSeparatedListAction)
    print(parser.parse_args('-l a,1,c,d'.split()))
    
    # usage: list.py [-h] [-l L]
    # list.py: error: l must be a comma separated list of letters
    

提交回复
热议问题