সাবকমান্ড এবং কাস্টম অ্যাকশন ক্লাসের জন্য উন্নত কৌশলগুলির সাথে পাইথনের argparse মডিউলের সম্পূর্ণ সম্ভাবনা উন্মোচন করুন, যা কমান্ড-লাইন ইন্টারফেস ডিজাইন এবং ব্যবহারকারীর অভিজ্ঞতা বাড়ায়।
উন্নত পাইথন Argparse: সাবকমান্ড এবং কাস্টম অ্যাকশন ক্লাসে দক্ষতা অর্জন
পাইথনের argparse
মডিউল কমান্ড-লাইন ইন্টারফেস (CLIs) তৈরির জন্য একটি শক্তিশালী টুল। যদিও এর সাধারণ ব্যবহার বেশ সহজ, argparse
উন্নত বৈশিষ্ট্য সরবরাহ করে যা পরিশীলিত এবং ব্যবহারকারী-বান্ধব CLI তৈরি করতে সাহায্য করে। এই ব্লগ পোস্টে দুটি উন্নত বৈশিষ্ট্য নিয়ে আলোচনা করা হয়েছে: সাবকমান্ড এবং কাস্টম অ্যাকশন ক্লাস।
কেন উন্নত Argparse?
কয়েকটি বিকল্প সহ সাধারণ স্ক্রিপ্টের জন্য, argparse
-এর প্রাথমিক কার্যকারিতা যথেষ্ট হতে পারে। তবে, আপনার স্ক্রিপ্টগুলি যখন জটিলতা এবং কার্যকারিতায় বৃদ্ধি পায়, তখন একটি আরও কাঠামোবদ্ধ এবং সংগঠিত CLI অপরিহার্য হয়ে ওঠে। উন্নত argparse
বৈশিষ্ট্যগুলি সাহায্য করে:
- ব্যবহারকারীর অভিজ্ঞতা উন্নত করুন: ব্যবহারকারীদের জন্য একটি স্পষ্ট এবং স্বজ্ঞাত ইন্টারফেস সরবরাহ করুন।
- কোডের রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি করুন: আপনার কোডকে যৌক্তিক মডিউলে সংগঠিত করুন, যা বোঝা এবং রক্ষণাবেক্ষণ করা সহজ করে তোলে।
- কার্যকারিতা বাড়ান: একটি একক স্ক্রিপ্টের মধ্যে জটিল ওয়ার্কফ্লো এবং একাধিক অপারেশন সমর্থন করুন।
- পুনরায় ব্যবহারযোগ্যতা প্রচার করুন: পুনরায় ব্যবহারযোগ্য উপাদান তৈরি করুন যা আপনার অ্যাপ্লিকেশনের বিভিন্ন অংশে প্রয়োগ করা যেতে পারে।
সাবকমান্ড: জটিল CLI গুছিয়ে সাজানো
সাবকমান্ড হল একটি প্রধান কমান্ডের অধীনে সম্পর্কিত কমান্ডগুলিকে গোষ্ঠীভুক্ত করার একটি উপায়। এটি বিশেষত সেইসব অ্যাপ্লিকেশনের জন্য দরকারী যা বিভিন্ন স্বতন্ত্র কাজ সম্পাদন করে। উদাহরণস্বরূপ, Git-এর কথা ভাবুন। এটি ব্যাপকভাবে সাবকমান্ড ব্যবহার করে: git commit
, git push
, git pull
, ইত্যাদি। প্রতিটি সাবকমান্ডের নিজস্ব আর্গুমেন্ট এবং বিকল্প রয়েছে।
argparse
দিয়ে সাবকমান্ড বাস্তবায়ন
argparse
দিয়ে সাবকমান্ড বাস্তবায়ন করতে, আপনি add_subparsers()
পদ্ধতি ব্যবহার করেন। এখানে একটি প্রাথমিক উদাহরণ দেওয়া হলো:
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()
এই উদাহরণে:
- আমরা
argparse.ArgumentParser()
ব্যবহার করে একটি প্রধান পার্সার তৈরি করি। - আমরা
parser.add_subparsers(dest='command', help='Available commands')
ব্যবহার করে একটি সাবপার্সার যোগ করি।dest
আর্গুমেন্টটি সেই অ্যাট্রিবিউট নির্দিষ্ট করে যেখানে নির্বাচিত সাবকমান্ডের নাম সংরক্ষণ করা হবে। - আমরা
subparsers.add_parser()
ব্যবহার করে 'add' এবং 'subtract' নামে দুটি সাবকমান্ড তৈরি করি। - প্রতিটি সাবকমান্ডের নিজস্ব আর্গুমেন্ট (
x
এবংy
) রয়েছে। - আমরা
parser.parse_args()
ব্যবহার করে আর্গুমেন্ট পার্স করি। - আমরা
args.command
-এর মান পরীক্ষা করে দেখি কোন সাবকমান্ডটি বেছে নেওয়া হয়েছে এবং তারপর সংশ্লিষ্ট কাজটি সম্পাদন করি।
এই স্ক্রিপ্টটি চালানোর জন্য, আপনি এই ধরনের কমান্ড ব্যবহার করবেন:
python your_script.py add 5 3
python your_script.py subtract 10 2
উন্নত সাবকমান্ড কৌশল
১. সাবকমান্ড পরিচালনার জন্য ফাংশন ব্যবহার
একটি আরও সংগঠিত পদ্ধতি হল প্রতিটি সাবকমান্ড পরিচালনার জন্য পৃথক ফাংশন সংজ্ঞায়িত করা। এটি কোডের পঠনযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করে।
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()
এখানে, আমরা প্রতিটি সাবকমান্ডের সাথে একটি ফাংশন সংযুক্ত করতে set_defaults(func=...)
ব্যবহার করি। তারপর, পার্স করার পরে, আমরা উপযুক্ত ফাংশনটি কল করি যদি এটি বিদ্যমান থাকে।
২. নেস্টেড সাবকমান্ড
আপনি আরও জটিল এবং স্তরভিত্তিক CLI তৈরি করতে সাবকমান্ড নেস্ট করতে পারেন। উদাহরণস্বরূপ, ক্লাউড রিসোর্স পরিচালনার জন্য একটি CLI বিবেচনা করুন:
cloud compute instance create --name my-instance --region us-east-1
cloud storage bucket list --project my-project
এই উদাহরণে, cloud
হল প্রধান কমান্ড, compute
এবং storage
হল সাবকমান্ড, এবং instance
ও bucket
হল সাব-সাবকমান্ড।
৩. বাস্তব-জগতের উদাহরণ: আন্তর্জাতিকীকরণ টুল
একটি বহুভাষিক অ্যাপ্লিকেশনে অনুবাদ পরিচালনার জন্য একটি টুলের কথা ভাবুন। আপনি বিভিন্ন অপারেশন সংগঠিত করতে সাবকমান্ড ব্যবহার করতে পারেন:
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
এই পদ্ধতিটি উদ্বেগের একটি স্পষ্ট পৃথকীকরণের অনুমতি দেয় এবং টুলটিকে ব্যবহার ও রক্ষণাবেক্ষণ করা সহজ করে তোলে, বিশেষ করে যখন বিভিন্ন দেশে প্রযোজ্য অসংখ্য ভাষা এবং অনুবাদ কর্মপ্রবাহের সাথে কাজ করা হয়।
কাস্টম অ্যাকশন ক্লাস: আর্গুমেন্ট পার্সিং কাস্টমাইজ করা
argparse
আপনাকে কাস্টম অ্যাকশন ক্লাস সংজ্ঞায়িত করার অনুমতি দেয় যাতে আর্গুমেন্টগুলি কীভাবে প্রক্রিয়াজাত করা হয় তা কাস্টমাইজ করা যায়। এটি সেইসব ক্ষেত্রে উপযোগী যেখানে ডিফল্ট আর্গুমেন্ট প্রক্রিয়াকরণ আচরণ যথেষ্ট নয়। একটি অ্যাকশন ক্লাস হল এমন একটি ক্লাস যা argparse.Action
থেকে ইনহেরিট করে এবং __call__
পদ্ধতিকে ওভাররাইড করে।
একটি কাস্টম অ্যাকশন ক্লাস তৈরি করা
এখানে একটি কাস্টম অ্যাকশন ক্লাসের উদাহরণ রয়েছে যা একটি আর্গুমেন্টকে বড় হাতের অক্ষরে রূপান্তরিত করে:
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}')
এই উদাহরণে:
- আমরা
ToUpper
নামে একটি ক্লাস সংজ্ঞায়িত করি যাargparse.Action
থেকে ইনহেরিট করে। - আর্গুমেন্টটি সম্মুখীন হলে
__call__
পদ্ধতিটি কল করা হয়। এটি নিম্নলিখিত আর্গুমেন্টগুলি নেয়:parser
:ArgumentParser
অবজেক্ট।namespace
: নেমস্পেস অবজেক্ট যেখানে পার্স করা আর্গুমেন্টগুলি সংরক্ষণ করা হয়।values
: আর্গুমেন্টের মান(গুলি)।option_string
: অপশন স্ট্রিং যা এই অ্যাকশনটি আহ্বান করতে ব্যবহৃত হয়েছিল (যেমন,--name
)।
__call__
পদ্ধতির ভিতরে, আমরাvalues.upper()
ব্যবহার করে মানটিকে বড় হাতের অক্ষরে রূপান্তরিত করি এবংsetattr(namespace, self.dest, values.upper())
ব্যবহার করে এটি নেমস্পেসে সংরক্ষণ করি।- আমরা
parser.add_argument('--name', action=ToUpper, help='Name to convert to uppercase')
ব্যবহার করে পার্সারে একটি আর্গুমেন্ট যোগ করি। আমরাaction
আর্গুমেন্টটিকে আমাদের কাস্টম অ্যাকশন ক্লাস হিসাবে নির্দিষ্ট করি।
এই স্ক্রিপ্টটি চালানোর জন্য, আপনি এই ধরনের কমান্ড ব্যবহার করবেন:
python your_script.py --name john
python your_script.py --cities london paris tokyo
কাস্টম অ্যাকশন ক্লাসের ব্যবহারের ক্ষেত্র
১. ইনপুট যাচাই করা
আপনি ইনপুট যাচাই করতে এবং ইনপুট অবৈধ হলে একটি ত্রুটি উত্থাপন করতে কাস্টম অ্যাকশন ক্লাস ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি একটি অ্যাকশন ক্লাস তৈরি করতে পারেন যা একটি ফাইল বিদ্যমান কিনা বা একটি সংখ্যা একটি নির্দিষ্ট পরিসরের মধ্যে আছে কিনা তা পরীক্ষা করে।
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}')
২. একক রূপান্তর করা
আপনি একক রূপান্তর করতে কাস্টম অ্যাকশন ক্লাস ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি একটি অ্যাকশন ক্লাস তৈরি করতে পারেন যা তাপমাত্রা সেলসিয়াস থেকে ফারেনহাইটে রূপান্তরিত করে।
৩. জটিল ডেটা স্ট্রাকচার পরিচালনা করা
যদি আপনাকে আর্গুমেন্টগুলি জটিল ডেটা স্ট্রাকচারে (যেমন, ডিকশনারি, অবজেক্টের তালিকা) পার্স করতে হয়, তবে আপনি পার্সিং যুক্তি পরিচালনা করতে কাস্টম অ্যাকশন ক্লাস ব্যবহার করতে পারেন।
৪. উদাহরণ: টাইম জোন পরিচালনা করা
এমন একটি অ্যাপ্লিকেশনের কথা ভাবুন যা বিভিন্ন টাইম জোনে তারিখ এবং সময় পরিচালনা করতে হয়। একটি কাস্টম অ্যাকশন ক্লাস একটি তারিখ স্ট্রিং পার্স করতে এবং pytz
-এর মতো লাইব্রেরি ব্যবহার করে এটিকে একটি নির্দিষ্ট টাইম জোনে রূপান্তর করতে ব্যবহার করা যেতে পারে।
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}')
এই উদাহরণটি দেখায় যে কীভাবে কাস্টম অ্যাকশনগুলি pytz
লাইব্রেরি ব্যবহার করে টাইম জোন রূপান্তর পরিচালনা করতে পারে, যা একটি আরও পরিশীলিত ব্যবহারের প্রদর্শন করে যা বিশ্বব্যাপী প্রাসঙ্গিক।
উন্নত Argparse ব্যবহারের সেরা অনুশীলন
- সহজ রাখুন: আপনার CLI-কে অতিরিক্ত জটিল করবেন না। শুধুমাত্র প্রয়োজনে সাবকমান্ড এবং কাস্টম অ্যাকশন ব্যবহার করুন।
- স্পষ্ট হেল্প মেসেজ দিন: প্রতিটি কমান্ড এবং আর্গুমেন্টের জন্য স্পষ্ট এবং সংক্ষিপ্ত হেল্প মেসেজ লিখুন।
add_argument()
-এhelp
আর্গুমেন্টটি ব্যাপকভাবে ব্যবহার করুন। - ইনপুট যাচাই করুন: ত্রুটি এবং নিরাপত্তা দুর্বলতা প্রতিরোধ করতে সর্বদা ব্যবহারকারীর ইনপুট যাচাই করুন।
- সামঞ্জস্যপূর্ণ নামকরণের নিয়ম ব্যবহার করুন: কমান্ড, আর্গুমেন্ট এবং বিকল্পগুলির জন্য সামঞ্জস্যপূর্ণ নামকরণের নিয়ম অনুসরণ করুন। দীর্ঘ বিকল্প নামের জন্য kebab-case (
--my-option
) ব্যবহার করার কথা ভাবুন। - পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন: বিভিন্ন ইনপুট এবং পরিস্থিতি দিয়ে আপনার CLI পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন।
- আপনার CLI ডকুমেন্ট করুন: আপনার CLI-এর জন্য ব্যাপক ডকুমেন্টেশন সরবরাহ করুন, যার মধ্যে প্রতিটি কমান্ড এবং আর্গুমেন্ট কীভাবে ব্যবহার করতে হয় তার উদাহরণ অন্তর্ভুক্ত থাকবে। Sphinx-এর মতো টুল আপনার কোড থেকে ডকুমেন্টেশন তৈরি করতে পারে।
- স্থানীয়করণের কথা ভাবুন: যদি আপনার CLI একটি বিশ্বব্যাপী দর্শকদের জন্য হয়, তবে আপনার হেল্প মেসেজ এবং অন্যান্য ব্যবহারকারী-মুখী টেক্সট স্থানীয়করণের কথা ভাবুন।
উপসংহার
সাবকমান্ড এবং কাস্টম অ্যাকশন ক্লাসগুলি argparse
দিয়ে পরিশীলিত এবং ব্যবহারকারী-বান্ধব CLI তৈরির জন্য শক্তিশালী টুল। এই উন্নত বৈশিষ্ট্যগুলিতে দক্ষতা অর্জনের মাধ্যমে, আপনি শক্তিশালী, রক্ষণাবেক্ষণযোগ্য এবং মাপযোগ্য কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করতে পারেন যা একটি বৈচিত্র্যময় ব্যবহারকারী বেসের চাহিদা পূরণ করে। বহুভাষিক অ্যাপ্লিকেশন পরিচালনা করা থেকে শুরু করে বিশ্বজুড়ে টাইম জোন পরিচালনা করা পর্যন্ত, সম্ভাবনাগুলি বিশাল। আপনার পাইথন স্ক্রিপ্টিং এবং কমান্ড-লাইন টুল ডেভেলপমেন্টকে পরবর্তী স্তরে নিয়ে যেতে এই কৌশলগুলি গ্রহণ করুন।