Skip to main content
 首页 » 编程设计

python之Argparse nargs ="+"正在吃位置参数

2025年05月04日30xiaohuochai

这是我的解析器配置的一部分

parser.add_argument( 
    'infile', help="The file to be imported", 
    type=argparse.FileType('r'), default=sys.stdin 
) 
 
parser.add_argument( 
    '--carpark', nargs='+', dest='CarparkID', type=int, default=[], 
    help="One or many carpark IDs" 
) 

但是,--carpark 参数似乎过于贪婪并且吃掉了它后面的任何:

$ mycommand --carpark 17 ~/path-to-file 
mycommand: error: argument --carpark: invalid int value: '/home/oli/path-to-file' 

解决此类问题的好方法是什么?我需要将整数 ID 列表传递到命令中,但也需要一个位置文件(也可以是标准输入)。

例如,是否有一个非贪婪的 nargs 选项,它只会解析尽可能多的有意义的内容?

请您参考如下方法:

如果您想指定多个 parking 场 ID,我会做以下两件事之一,而不是使用 nargs='+':

  1. 每个 ID 使用该选项一次(mycommand --carpark 17 --carpark 18)

    parser.add_argument('--carpark', 
                        dest='carpark_ids', 
                        type=int, 
                        action='append', 
                        default=[], 
                        help="One carpark ID (can be used multiple times)" 
    ) 
    
  2. 取一个逗号分隔的参数(mycommand --carpark 17,18)

    def intlist(s): 
        rv = [] 
        for x in s.split(','): 
            try: 
                x = int(x) 
            except ValueError: 
                raise ArgumentTypeError("Non-integer carpark id {x}" % (x,)) 
            rv.append(x) 
        return rv 
     
    parser.add_argument('--carpark', 
                        type=intlist, 
                        dest='carpark_ids', 
                        default=[], 
                        help="One or more carpark IDs" 
    ) 
    

    再做一些工作,您可以修改它以允许多次使用 --carpark 以将其所有值累积到一个列表中。

第三种选择,我不是特别喜欢,是放弃位置参数,将其设为可选参数。 (mycommand --carpark 17 18 --infile ~/path-to-file)。

parser.add_argument('--infile', 
                    help="The file to be imported", 
                    type=argparse.FileType('r'), 
                    default=sys.stdin 
) 
 
parser.add_argument('--carpark', 
                    nargs='+', 
                    dest='CarparkID', 
                    type=int, 
                    default=[], 
                    help="One or many carpark IDs" 
)