python中type 2_Python,argparse:如何让nargs=2的type=str和type=in

我倾向于同意迈克的解决办法,但这里有另一种方法。这并不理想,因为usage/help字符串告诉用户使用一个或多个参数。import argparse

def string_integer(int_default):

"""Action for argparse that allows a mandatory and optional

argument, a string and integer, with a default for the integer.

This factory function returns an Action subclass that is

configured with the integer default.

"""

class StringInteger(argparse.Action):

"""Action to assign a string and optional integer"""

def __call__(self, parser, namespace, values, option_string=None):

message = ''

if len(values) not in [1, 2]:

message = 'argument "{}" requires 1 or 2 arguments'.format(

self.dest)

if len(values) == 2:

try:

values[1] = int(values[1])

except ValueError:

message = ('second argument to "{}" requires '

'an integer'.format(self.dest))

else:

values.append(int_default)

if message:

raise argparse.ArgumentError(self, message)

setattr(namespace, self.dest, values)

return StringInteger

这样,你就可以:>>> import argparse

>>> parser = argparse.ArgumentParser(description="")

parser.add_argument('-r', '--rmsd', dest='rmsd', nargs='+',

... action=string_integer(50),

... help="extract the poses that are close from a ref "

... "according RMSD")

>>> parser.parse_args('-r reference'.split())

Namespace(rmsd=['reference', 50])

>>> parser.parse_args('-r reference 30'.split())

Namespace(rmsd=['reference', 30])

>>> parser.parse_args('-r reference 30 3'.split())

usage: [-h] [-r RMSD [RMSD ...]]

: error: argument -r/--rmsd: argument "rmsd" requires 1 or 2 arguments

>>> parser.parse_args('-r reference 30.3'.split())

usage: [-h] [-r RMSD [RMSD ...]]

: error: argument -r/--rmsd: second argument to "rmsd" requires an integer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值