دیگر استدلال های argparse

  • مدرس: علی بیگدلی
  • تاریخ انتشار: 1402/05/04
  • تعداد بازدید: 202

استدلال های موقعیتی argparse

مثال زیر با استدلال های موقعیتی کار می کند. آنها با add_argument () ایجاد می شوند.

import argparse

# positional args

parser = argparse.ArgumentParser()
   
parser.add_argument('name')
parser.add_argument('age')

args = parser.parse_args()

print(f'{args.name} is {args.age} years old')

مثال انتظار دو استدلال موضعی را دارد: نام و سن.

parser.add_argument('name')
parser.add_argument('age')

آرگومان های موقعیتی بدون نویسه های پیشوند داش ایجاد می شوند.

positional_arg.py Peter 23
Peter is 23 years old

گزینه dest از add_argument () یک نام به آرگومان می دهد. اگر داده نشود ، از گزینه استنباط می شود.

import argparse
import datetime

# dest gives a different name to a flag

parser = argparse.ArgumentParser()
   
parser.add_argument('-n', dest='now', action='store_true', help="shows now")

args = parser.parse_args()

# we can refer to the flag
# by a new name
if args.now:

    now = datetime.datetime.now()
    print(f"Now: {now}")

برنامه نام فعلی را به آرگومان -n می دهد.

dest.py -n
Now: 2019-03-22 17:37:40.406571

نوع argparse 

آرگومان type نوع آرگومان را تعیین می کند.

import argparse
import random

# type determines the type of the argument

parser = argparse.ArgumentParser()
   
parser.add_argument('-n', type=int, required=True, 
    help="define the number of random integers")
args = parser.parse_args()

n = args.n

for i in range(n):
    print(random.randint(-100, 100))

این برنامه n عدد صحیح تصادفی را از -100 تا 100 نشان می دهد.

parser.add_argument('-n', type=int, required=True, 
    help="define the number of random integers")

گزینه -n انتظار مقدار عدد صحیح را دارد و لازم است.

rand_int.py -n 3
92
-61
-61

پیشفرض در argparse

اگر مقدار داده نشده باشد ، گزینه پیش فرض مقدار پیش فرض را مشخص می کند.

import argparse

# required defines a mandatory argument 
# default defines a default value if not specified

parser = argparse.ArgumentParser()

parser.add_argument('-b', type=int, required=True, help="defines the base value")
parser.add_argument('-e', type=int, default=2, help="defines the exponent value")
args = parser.parse_args()

val = 1

base = args.b
exp = args.e

for i in range(exp):
    val *= base

print(val)

مثال زیر توان را محاسبه می کند. مقدار نماد مورد نیاز نیست اگر داده نشود ، پیش فرض 2 خواهد بود.

power.py -b 3
9
power.py -b 3 -e 3
27

argparse metavar

گزینه metavar به مقدار مورد انتظار در خطا کمک می کند و به خروجی ها کمک می کند.

import argparse

# metavar gives name to the expected value 
# in error and help outputs

parser = argparse.ArgumentParser()
   
parser.add_argument('-v', type=int, required=True, metavar='value', 
    help="computes cube for the given value")
args = parser.parse_args()

print(args)

val = args.v

print(val * val * val)

مثال مقدار ارزش مورد انتظار را نامگذاری می کند. نام پیش فرض V است.

metavar.py -h
usage: metavar.py [-h] -v value

optional arguments:
  -h, --help  show this help message and exit
  -v value    computes cube for the given value

argparse append

عملکرد ضمیمه امکان گروه بندی گزینه های تکرار را فراهم می کند.

import argparse

# append action allows to group repeating
# options

parser = argparse.ArgumentParser()
   
parser.add_argument('-n', '--name', dest='names', action='append', 
    help="provides names to greet")

args = parser.parse_args()

names = args.names

for name in names:
    print(f'Hello {name}!')

به عنوان مثال پیام های تبریک به تمام نام های مشخص شده با گزینه های n یا name تولید می شود. آنها می توانند چندین بار تکرار شوند.

appending.py -n Peter -n Lucy --name Jane
Hello Peter!
Hello Lucy!
Hello Jane!

argparse nargs

nargs تعداد آرگومان های خط فرمان را مشخص می کند.

import argparse
import sys

# nargs sets the required number of argument values
# metavar gives name to argument values in error and help output

parser = argparse.ArgumentParser()
parser.add_argument('chars', type=str, nargs=2, metavar='c',
                    help='starting and ending character')

args = parser.parse_args()

try:
    v1 = ord(args.chars[0])
    v2 = ord(args.chars[1])
    for i in range(v1,v2):
        print(chr(i))

except TypeError as e:
    raise
    print('Error: arguments must be characters')
    parser.print_help()
    sys.exit(1)

if v1 > v2:
    print('first letter must precede the second in alphabet')
    parser.print_help()
    sys.exit(1)

مثال توالی کارکترها را ازکارکتر یک به کارکتر دو نشان می دهد. انتظار دو استدلال دارد.

parser.add_argument('chars', type=str, nargs=2, metavar='c',
    help='starting and ending character')

با nargs = 2 مشخص می کنیم که انتظار دو استدلال را داریم.

charseq.py e k
e
f
g
h
i
j

این برنامه توالی کارکترها را از e تا k نشان می دهد.

تعداد متغیر آرگومان ها را می توان با کارکتر* تنظیم کرد.

import argparse

# * nargs expects 0 or more arguments

parser = argparse.ArgumentParser()
parser.add_argument('num', type=int, nargs='*')
args = parser.parse_args()

print(f"The sum of values is {sum(args.num)}")

مثال مجموع مقادیر را محاسبه می کند. ما می توانیم تعداد متغیر آرگومان ها را برای برنامه مشخص کنیم.

var_args.py 1 2 3 4 5
The sum of values is 15

argparse choices

گزینه Choices آرگومان های موجود در لیست داده شده را محدود می کند.

import argparse
import datetime
import time

# choices limits argument values to the 
# given list

parser = argparse.ArgumentParser()

parser.add_argument('--now', dest='format', choices=['std', 'iso', 'unix', 'tz'],
                    help="shows datetime in given format")

args = parser.parse_args()
fmt = args.format

if fmt == 'std':
    print(datetime.date.today())
elif fmt == 'iso':
    print(datetime.datetime.now().isoformat())
elif fmt == 'unix':
    print(time.time())
elif fmt == 'tz':
    print(datetime.datetime.now(datetime.timezone.utc))

در مثال ، گزینه now می تواند مقادیر زیر را بپذیرد: std ، iso ، unix یا tz.

mytime.py --now iso
2019-03-27T11:34:54.106643

mytime.py --now unix
1553682898.422863

Head example

مثال زیر دستور head Linux را تقلید می کند. n سطرهای یک متن از ابتدای پرونده را نشان می دهد.

# words.txt

sky
top
forest
wood
lake
wood

به عنوان مثال ، ما این پرونده آزمایشی کوچک را داریم.

import argparse
from pathlib import Path

# head command
# working with positional arguments

parser = argparse.ArgumentParser()
   
parser.add_argument('f', type=str, help='file name')
parser.add_argument('n', type=int, help='show n lines from the top')

args = parser.parse_args()

filename = args.f

lines = Path(filename).read_text().splitlines()

for line in lines[:args.n]:
    print(line) 

مثال دارای دو گزینه است: f برای یک نام پرونده و -n برای تعداد خطوط نشان داده شده است.

head.py words.txt 3
sky
top
forest