Можно ли будет использовать argparse без каких-либо флагов? - PullRequest
0 голосов
/ 20 декабря 2018

Можно ли использовать argparse без каких-либо флагов?

Например, когда нет никаких флагов (-u или -i в этом случае), я бы хотел, чтобы скрипт обрабатывалпервый аргумент sys.argv[1] в качестве IP-адреса.

код

import argparse, sys

parser = argparse.ArgumentParser()

parser.add_argument('-u')
parser.add_argument('-i')

args = parser.parse_args()

if args.i:
    print("IP Address is " + args.i)
elif args.u:
    print("URL is " + args.u)
elif len(sys.argv) > 1: 
    print("IP Address is " + sys.argv[1])
else: 
    print("No arguments ")

нормальный вывод

C:\>python script.py
No arguments

C:\>python script.py 8.8.8.8
usage: script.py [-h] [-u U] [-i I]
script.py: error: unrecognized arguments: 8.8.8.8

C:\>python script.py -i 8.8.8.8
IP Address is 8.8.8.8

C:\>

Мой желаемый вывод, даже если не указаны флаги (-u или -i).

C:\>python script.py 8.8.8.8
IP Address is 8.8.8.8

C:\>python script.py -i 8.8.8.8
IP Address is 8.8.8.8

Если есть лучшая альтернатива, пожалуйста, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы можете использовать 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
0 голосов
/ 20 декабря 2018

Вы можете сделать что-то вроде этого:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-i', dest='type', action='store_const',
                    const='ip', default='ip')
parser.add_argument('-u', dest='type', action='store_const',
                    const='url')

parser.add_argument('location', nargs='?', default=None)

args = parser.parse_args()

if args.location is not None:
    if args.type == 'ip':
        print("IP Address is " + args.location)
    elif args.type == 'url':
        print("URL is " + args.location)
else:
    print("No argument provided")

Здесь мы используем опции как способ указать тип и сделать местоположение обязательным аргументом.Тип по умолчанию будет ip, поэтому он задает требуемое поведение по умолчанию, но вы можете использовать как -i, так и -u, чтобы быть более явным.

...