Python argparse modulining ilg'or usullari (subkomandalar va maxsus harakat sinflari) bilan buyruq qatori interfeysi (CLI) dizayni va foydalanuvchi tajribasini takomillashtiring.
Python Argparse ilg'or: Subkomandalar va maxsus harakat sinflarini o'zlashtirish
Python'ning argparse
moduli buyruq qatori interfeyslarini (CLI) yaratish uchun kuchli vositadir. Asosiy foydalanish nisbatan sodda bo'lsa-da, argparse
murakkab va foydalanuvchilar uchun qulay CLI'larni yaratishga imkon beruvchi ilg'or funksiyalarni taklif etadi. Ushbu blog posti bunday ilg'or funksiyalardan ikkitasini: subkomandalar va maxsus harakat sinflarini chuqur o'rganadi.
Nima uchun ilg'or Argparse?
Bir nechta variantga ega oddiy skriptlar uchun asosiy argparse
funksionalligi yetarli bo'lishi mumkin. Biroq, skriptlaringiz murakkablashib, funksionalligi oshgan sari, yanada tuzilgan va tartibli CLI zarur bo'ladi. Ilg'or argparse
funksiyalari quyidagilarga yordam beradi:
- Foydalanuvchi tajribasini yaxshilash: Foydalanuvchilar uchun aniq va intuitiv interfeys taqdim etish.
- Kodning boshqaruvchanligini oshirish: Kodingizni mantiqiy modullarga ajratish, bu tushunish va saqlashni osonlashtiradi.
- Funksionallikni oshirish: Murakkab ish oqimlarini va bitta skript ichida bir nechta operatsiyalarni qo'llab-quvvatlash.
- Qayta foydalanishni rag'batlantirish: Ilovaning turli qismlariga qo'llanilishi mumkin bo'lgan qayta foydalanish mumkin bo'lgan komponentlarni yaratish.
Subkomandalar: Murakkab CLI'larni tartibga solish
Subkomandalar bir asosiy buyruq ostida bog'liq buyruqlarni guruhlash usulidir. Bu turli xil vazifalarni bajaradigan ilovalar uchun ayniqsa foydalidir. Masalan, Gitni o'ylab ko'ring. U subkomandalardan keng foydalanadi: git commit
, git push
, git pull
va hokazo. Har bir subkomanda o'zining argumentlari va opsiyalariga ega.
argparse
yordamida subkomandalarni amalga oshirish
argparse
yordamida subkomandalarni amalga oshirish uchun add_subparsers()
metodidan foydalanasiz. Mana asosiy misol:
import argparse
# Create the main parser
parser = argparse.ArgumentParser(description='A simple example with subcommands')
# Create the subparser
subparsers = parser.add_subparsers(dest='command', help='Available commands')
# Create the 'add' subcommand
add_parser = subparsers.add_parser('add', help='Add two numbers')
add_parser.add_argument('x', type=int, help='First number')
add_parser.add_argument('y', type=int, help='Second number')
# Create the 'subtract' subcommand
subtract_parser = subparsers.add_parser('subtract', help='Subtract two numbers')
subtract_parser.add_argument('x', type=int, help='First number')
subtract_parser.add_argument('y', type=int, help='Second number')
# Parse the arguments
args = parser.parse_args()
# Perform the action based on the subcommand
if args.command == 'add':
result = args.x + args.y
print(f'The sum is: {result}')
elif args.command == 'subtract':
result = args.x - args.y
print(f'The difference is: {result}')
else:
parser.print_help()
Ushbu misolda:
- Biz
argparse.ArgumentParser()
yordamida asosiy tahlilchini yaratamiz. - Biz
parser.add_subparsers(dest='command', help='Available commands')
yordamida subparser qo'shamiz. Thedest
argumenti tanlangan subkomanda nomini saqlaydigan atributni belgilaydi. - Biz
subparsers.add_parser()
yordamida ikkita 'add' va 'subtract' subkomandalarini yaratamiz. - Har bir subkomanda o'zining argumentlariga (
x
vay
) ega. - Biz
parser.parse_args()
yordamida argumentlarni tahlil qilamiz. - Qaysi subkomanda tanlanganini aniqlash uchun
args.command
qiymatini tekshiramiz va keyin tegishli harakatni bajaramiz.
Ushbu skriptni ishga tushirish uchun siz quyidagi buyruqlardan foydalanasiz:
python your_script.py add 5 3
python your_script.py subtract 10 2
Ilg'or subkomanda texnikalari
1. Subkomandalarni boshqarish uchun funksiyalardan foydalanish
Yanada tartibli yondashuv har bir subkomandani boshqarish uchun alohida funksiyalarni aniqlashdir. Bu kodning o'qiluvchanligini va boshqaruvchanligini yaxshilaydi.
import argparse
def add(args):
result = args.x + args.y
print(f'The sum is: {result}')
def subtract(args):
result = args.x - args.y
print(f'The difference is: {result}')
# Create the main parser
parser = argparse.ArgumentParser(description='A simple example with subcommands')
# Create the subparser
subparsers = parser.add_subparsers(dest='command', help='Available commands')
# Create the 'add' subcommand
add_parser = subparsers.add_parser('add', help='Add two numbers')
add_parser.add_argument('x', type=int, help='First number')
add_parser.add_argument('y', type=int, help='Second number')
add_parser.set_defaults(func=add)
# Create the 'subtract' subcommand
subtract_parser = subparsers.add_parser('subtract', help='Subtract two numbers')
subtract_parser.add_argument('x', type=int, help='First number')
subtract_parser.add_argument('y', type=int, help='Second number')
subtract_parser.set_defaults(func=subtract)
# Parse the arguments
args = parser.parse_args()
# Call the function associated with the subcommand
if hasattr(args, 'func'):
args.func(args)
else:
parser.print_help()
Bu yerda biz har bir subkomandaga funksiyani bog'lash uchun set_defaults(func=...)
dan foydalanamiz. Keyin, tahlildan so'ng, agar u mavjud bo'lsa, tegishli funksiyani chaqiramiz.
2. Subkomandalarni joylash (Nesting)
Yanada murakkab va iyerarxik CLI'larni yaratish uchun subkomandalarni joylashtirishingiz mumkin. Masalan, bulut resurslarini boshqarish uchun CLI'ni ko'rib chiqing:
cloud compute instance create --name my-instance --region us-east-1
cloud storage bucket list --project my-project
Ushbu misolda, cloud
asosiy buyruq, compute
va storage
subkomandalar, instance
va bucket
esa sub-subkomandalardir.
3. Haqiqiy dunyo misoli: Xalqaroizatsiyalash vositasi
Ko'p tilli ilovada tarjimalarni boshqarish uchun vositani tasavvur qiling. Turli operatsiyalarni tartibga solish uchun subkomandalardan foydalanishingiz mumkin:
translation tool add-language --code fr_FR --name "French (France)"
translation tool extract-strings --source-dir src
translation tool translate --target-language es_ES --source-file strings.pot
Bu yondashuv vazifalarning aniq ajratilishini ta'minlaydi va ayniqsa ko'plab tillar va turli mamlakatlarda qo'llaniladigan tarjima ish oqimlari bilan ishlashda vositani ishlatish va saqlashni osonlashtiradi.
Maxsus harakat sinflari: Argumentlarni tahlil qilishni moslashtirish
argparse
argumentlarning qanday qayta ishlanishini moslashtirish uchun maxsus harakat sinflarini belgilashga imkon beradi. Bu standart argumentni qayta ishlash xatti-harakati yetarli bo'lmagan holatlar uchun foydalidir. Harakat sinfi argparse.Action
dan meros oluvchi va __call__
metodini bekor qiluvchi sinfdir.
Maxsus harakat sinfini yaratish
Mana argumentni bosh harflarga o'tkazadigan maxsus harakat sinfining misoli:
import argparse
class ToUpper(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if isinstance(values, list):
setattr(namespace, self.dest, [v.upper() for v in values])
else:
setattr(namespace, self.dest, values.upper())
# Create the parser
parser = argparse.ArgumentParser(description='Example with custom action')
# Add an argument with the custom action
parser.add_argument('--name', action=ToUpper, help='Name to convert to uppercase')
parser.add_argument('--cities', action=ToUpper, nargs='+', help='List of cities to convert to uppercase')
# Parse the arguments
args = parser.parse_args()
# Print the result
if args.name:
print(f'Name: {args.name}')
if args.cities:
print(f'Cities: {args.cities}')
Ushbu misolda:
- Biz
argparse.Action
dan meros oluvchiToUpper
sinfini belgilaymiz. - The
__call__
metodi argumentga duch kelganda chaqiriladi. U quyidagi argumentlarni qabul qiladi:parser
: TheArgumentParser
obyekti.namespace
: Tahlil qilingan argumentlar saqlanadigan namespace obyekti.values
: Argumentning qiymati (qiymatlari).option_string
: Ushbu harakatni chaqirish uchun ishlatilgan opsion satr (masalan,--name
).
__call__
metodi ichida bizvalues.upper()
yordamida qiymatni bosh harflarga o'tkazamiz va unisetattr(namespace, self.dest, values.upper())
yordamida namespacega saqlaymiz.- Biz
parser.add_argument('--name', action=ToUpper, help='Name to convert to uppercase')
yordamida tahlilchiga argument qo'shamiz. Bizaction
argumentini o'zimizning maxsus harakat sinfimiz sifatida belgilaymiz.
Ushbu skriptni ishga tushirish uchun siz quyidagi buyruqlardan foydalanasiz:
python your_script.py --name john
python your_script.py --cities london paris tokyo
Maxsus harakat sinflari uchun foydalanish holatlari
1. Kiritilgan ma'lumotlarni tasdiqlash
Kiritilgan ma'lumotlarni tasdiqlash va agar kiritilgan ma'lumot noto'g'ri bo'lsa, xatolikni ko'tarish uchun maxsus harakat sinflaridan foydalanishingiz mumkin. Masalan, fayl mavjudligini yoki son ma'lum bir diapazonda ekanligini tekshiradigan harakat sinfini yaratishingiz mumkin.
import argparse
import os
class FileMustExist(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if not os.path.exists(values):
raise argparse.ArgumentTypeError(f'File not found: {values}')
setattr(namespace, self.dest, values)
parser = argparse.ArgumentParser(description='Example validating file existence.')
parser.add_argument('--input-file', action=FileMustExist, help='Path to input file.')
args = parser.parse_args()
print(f'Input file: {args.input_file}')
2. Birlikni o'zgartirish
Birliklarni o'zgartirish uchun maxsus harakat sinflaridan foydalanishingiz mumkin. Masalan, Selsiydan Farengeytga haroratni o'zgartiradigan harakat sinfini yaratishingiz mumkin.
3. Murakkab ma'lumotlar tuzilmalarini boshqarish
Agar argumentlarni murakkab ma'lumotlar tuzilmalariga (masalan, lug'atlar, obyektlar ro'yxatlari) tahlil qilishingiz kerak bo'lsa, tahlil qilish mantiqini boshqarish uchun maxsus harakat sinflaridan foydalanishingiz mumkin.
4. Misol: Vaqt zonalarini boshqarish
Turli vaqt zonalaridagi sanalar va vaqtlarni boshqarish kerak bo'lgan ilovani ko'rib chiqing. Maxsus harakat sinfi sana qatorini tahlil qilish va uni pytz
kabi kutubxonalar yordamida ma'lum bir vaqt zonasiga o'tkazish uchun ishlatilishi mumkin.
import argparse
import datetime
import pytz
class TimeZoneConverter(argparse.Action):
def __init__(self, option_strings, dest, timezone=None, **kwargs):
super().__init__(option_strings, dest, **kwargs)
self.timezone = timezone
def __call__(self, parser, namespace, values, option_string=None):
try:
dt = datetime.datetime.fromisoformat(values)
if self.timezone:
tz = pytz.timezone(self.timezone)
dt = tz.localize(dt)
setattr(namespace, self.dest, dt)
except ValueError:
raise argparse.ArgumentTypeError(f\"Invalid date/time format. Use ISO format (YYYY-MM-DDTHH:MM:SS): {values}\")
except pytz.exceptions.UnknownTimeZoneError:
raise argparse.ArgumentTypeError(f\"Invalid Timezone: {self.timezone}\")
parser = argparse.ArgumentParser(description='Example with timezone conversion.')
parser.add_argument('--event-time', action=TimeZoneConverter, timezone='America/Los_Angeles', help='Event time in ISO format (YYYY-MM-DDTHH:MM:SS). Converts to America/Los_Angeles timezone.')
args = parser.parse_args(['--event-time', '2024-10-27T10:00:00'])
print(f'Event Time (Los Angeles): {args.event_time}')
Ushbu misol maxsus harakatlar pytz
kutubxonasi yordamida vaqt zonasi o'zgartirishlarini qanday boshqara olishini ko'rsatadi, bu global miqyosda dolzarb bo'lgan yanada murakkab foydalanishni namoyish etadi.
Ilg'or Argparse'dan foydalanish bo'yicha eng yaxshi amaliyotlar
- Uni sodda saqlang: CLI'ingizni murakkablashtirmang. Subkomandalar va maxsus harakatlardan faqat zarurat tug'ilganda foydalaning.
- Aniq yordam xabarlarini taqdim eting: Har bir buyruq va argument uchun aniq va qisqa yordam xabarlarini yozing.
add_argument()
dagihelp
argumentidan keng foydalaning. - Kiritilgan ma'lumotlarni tasdiqlang: Xatoliklar va xavfsizlik zaifliklarini oldini olish uchun har doim foydalanuvchi kiritgan ma'lumotlarni tasdiqlang.
- Izchil nomlash konvensiyalaridan foydalaning: Buyruqlar, argumentlar va opsiyalar uchun izchil nomlash konvensiyalariga rioya qiling. Uzoq opsion nomlar uchun kebab-case (
--my-option
) dan foydalanishni ko'rib chiqing. - Sinxron tarzda sinovdan o'tkazing: CLI'ingizni turli xil kiritmalar va stsenariylar bilan sinchkovlik bilan sinovdan o'tkazing.
- CLI'ingizni hujjatlashtiring: CLI'ingiz uchun har bir buyruq va argumentdan qanday foydalanish misollarini o'z ichiga olgan keng qamrovli hujjatlarni taqdim eting. Sphinx kabi vositalar kodingizdan hujjatlarni yaratishi mumkin.
- Mahalliylashtirishni ko'rib chiqing: Agar CLI'ingiz global auditoriya uchun mo'ljallangan bo'lsa, yordam xabarlaringizni va foydalanuvchiga qaratilgan boshqa matnlarni mahalliylashtirishni ko'rib chiqing.
Xulosa
Subkomandalar va maxsus harakat sinflari argparse
yordamida murakkab va foydalanuvchilar uchun qulay CLI'larni yaratish uchun kuchli vositalardir. Ushbu ilg'or funksiyalarni o'zlashtirib, siz turli xil foydalanuvchilar bazasining ehtiyojlarini qondiradigan mustahkam, boshqariladigan va kengaytiriladigan buyruq qatori ilovalarini yaratishingiz mumkin. Ko'p tilli ilovalarni boshqarishdan tortib, butun dunyo bo'ylab vaqt zonalarini boshqarishgacha, imkoniyatlar juda keng. Python skriptlash va buyruq qatori vositalarini ishlab chiqishni keyingi darajaga ko'tarish uchun ushbu texnikalarni o'zlashtiring.