Начиная с Python 3.3, parse_args
проверяет свой набор seen_actions
на набор требуемых действий и при необходимости выдает ошибку the following arguments are required...
.Ранее он проверил свой список оставшихся positionals
и выдал сообщение об ошибке too few arguments
.
Так что для более новых версий этот фрагмент должен делать то, что вы хотите:
parser = argparse.ArgumentParser()
lat=parser.add_argument('lat', help="latitude")
lon=parser.add_argument('lon', help="longitude")
parser.add_argument('--method', help="calculation method (default: add)", default="add")
class MyAction(argparse._StoreTrueAction):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, self.const)
lat.required = False
lon.required = False
parser.add_argument('--list-methods', help="list available methods", action=MyAction)
Обычно lat
и lon
являются обязательными позиционерами, но если предпринято действие --list...
, эти действия больше не требуются, и сообщение об ошибке не появляется, если они отсутствуют.
Другой способ настройкиargparse должен использовать несколько парсеров.В этом случае вы можете использовать один анализатор для проверки опции --list-methods
, и в зависимости от того, что он получает, вызвать другой, который ищет позиционеры.
parser1 = argparse.ArgumentParser(add_help=False)
parser1.add_argument('--list-methods', help="list available methods", action='store_true')
parser2 = argparse.ArgumentParser()
parser2.add_argument('lat', help="latitude")
parser2.add_argument('lon', help="longitude")
parser2.add_argument('--method', help="calculation method (default: add)", default="add")
parser2.add_argument('--list-methods', help="list available methods", action='store_true')
def foo(argv):
args,rest = parser1.parse_known_args(argv)
if not args.list_methods:
args = parser2.parse_args(argv)
return args
parser2
отвечает на команду справки.parse_known_args
разбирает, что может, и возвращает остаток в списке.parser2
также можно было бы написать, чтобы принять rest, args
в качестве аргументов.