Вы можете использовать ArgumentParser.parse_known_args()
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-u')
parser.add_argument('-i')
args, ip = parser.parse_known_args()
if args.i:
print("IP Address is " + args.i)
elif args.u:
print("URL is " + args.u)
elif ip:
print("IP Address is " + ip[0])
else:
print('No argument provided')
Недостатком этого является то, что он не будет отображаться в справке (если вы не включите его где-нибудь или не измените HelpFormatter
).
Другое решение заключается в использовании взаимоисключающей группы с позиционными аргументами, которая использует nargs='?'
:
import argparse, sys
parser = argparse.ArgumentParser()
parser.add_argument('-u')
group = parser.add_mutually_exclusive_group()
group.add_argument('-i')
group.add_argument('ip', nargs='?')
args = parser.parse_args()
if args.i:
print("IP Address is " + args.i)
elif args.ip:
print("IP Address is " + args.ip)
elif args.u:
print("URL is " + args.u)
else:
print('No argument provided')
, чтобы при попытке указать обапозиционный аргумент и -i
вы получите ошибку:
$ script.py 2.3.4.5 -i 1.2.3.4
usage: script.py [-h] [-u U] [-i I | ip]
p.py: error: argument -i: not allowed with argument ip
Это покажет, что вы можете использовать либо -i IP
, либо позиционный аргумент, хотя синтаксис может быть немного трудным для чтения людьми, не привыкшими ккомандная строка:
$ script.py -h
usage: script.py [-h] [-u U] [-i I | ip]
positional arguments:
ip
optional arguments:
-h, --help show this help message and exit
-u U
-i I