পাইথনের আর্গপার্সে বুলিয়ান মান নিয়ে কাজ করার সময় সতর্ক থাকুন

ব্যবসায়

পাইথনে কমান্ড লাইন আর্গুমেন্ট পরিচালনা করতে, sys মডিউলের argv বা argparse মডিউল ব্যবহার করুন।

আর্গপার্স মডিউল কমান্ড লাইন আর্গুমেন্টের নমনীয় হ্যান্ডলিংয়ের অনুমতি দেয়, তবে বুলিয়ান মান (সত্য, মিথ্যা) নিয়ে কাজ করার সময় অবশ্যই যত্ন নেওয়া উচিত।

নিম্নলিখিত তথ্য এখানে প্রদান করা হয়.

  • আর্গুমেন্টের সহজ সংজ্ঞার জন্য argparse
  • আর্গুমেন্টের ধরন (টাইপ) আর্গপার্স সহ উল্লেখ করুন
  • add_argument() এর আর্গুমেন্ট প্রকার হিসাবে “বুল” নির্দিষ্ট করবেন না
  • বুল () দ্বারা বিচার
  • আর্গুমেন্ট টাইপের পরিবর্তে আর্গুমেন্ট অ্যাকশন ব্যবহার করুন।
  • strtobool() ফাংশন ব্যবহার করে

আর্গুমেন্টের সহজ সংজ্ঞার জন্য argparse

argparse মডিউল কমান্ড লাইন আর্গুমেন্ট সংজ্ঞায়িত করা সহজ করে তোলে।

argparse মডিউল ব্যবহারকারী-বান্ধব কমান্ড লাইন ইন্টারফেস তৈরি করা সহজ করে তোলে। আপনার প্রোগ্রামের জন্য কোন আর্গুমেন্ট প্রয়োজন তা আপনি নির্ধারণ করুন এবং argparse sys.argv থেকে সেই বিকল্পগুলিকে কীভাবে পার্স করতে হয় তা নির্ধারণ করবে। argparse মডিউল স্বয়ংক্রিয়ভাবে সাহায্য এবং ব্যবহারের বার্তা তৈরি করে এবং ব্যবহারকারী প্রোগ্রামে অবৈধ আর্গুমেন্ট উল্লেখ করলে একটি ত্রুটি উত্থাপন করে। ব্যবহারকারী যখন প্রোগ্রামে অবৈধ আর্গুমেন্ট নির্দিষ্ট করে তখন ত্রুটি।
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

আর্গুমেন্টের ধরন (টাইপ) আর্গপার্স সহ উল্লেখ করুন

আর্গপার্সের একটি দরকারী বৈশিষ্ট্য হল প্রকার (টাইপ) নির্দিষ্ট করা।

উদাহরণস্বরূপ, যদি আপনি একটি পূর্ণসংখ্যা (int) টাইপ নির্দিষ্ট করেন, তাহলে এটি স্বয়ংক্রিয়ভাবে আর্গুমেন্টকে int-এ রূপান্তর করবে এবং int নয় এমন আর্গুমেন্টের জন্য একটি ত্রুটিও উত্থাপন করবে।

টাইপ add_argument() এর আর্গুমেন্ট টাইপ দ্বারা নির্দিষ্ট করা হয়।

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg_int', type=int)

args = parser.parse_args()
print(args.arg_int)
print(type(args.arg_int))

কমান্ড লাইন থেকে এই ফাইলটি চালান।

$ python argparse_type_int.py 100
100
<type 'int'>

আর্গুমেন্ট 100 int হিসাবে পড়া হয়.

যদি একটি অ-int মান একটি যুক্তি হিসাবে ব্যবহার করা হয়, একটি ত্রুটি ঘটবে.

$ python argparse_type_int.py foo
usage: argparse_type_int.py [-h] arg_int
argparse_type_int.py: error: argument arg_int: invalid int value: 'foo'

$ python argparse_type_int.py 1.23
usage: argparse_type_int.py [-h] arg_int
argparse_type_int.py: error: argument arg_int: invalid int value: '1.23'

অপ্রত্যাশিত আর্গুমেন্ট খেলার জন্য খুব দরকারী.

add_argument() এর আর্গুমেন্ট প্রকার হিসাবে “বুল” নির্দিষ্ট করবেন না

এটা মনে রাখা গুরুত্বপূর্ণ যে bool, যেমন int এবং float, আশানুরূপ কাজ করবে না যদি আপনি add_argument() এর আর্গুমেন্ট টাইপ হিসাবে bool উল্লেখ করেন।

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg_bool', type=bool)

args = parser.parse_args()
print(args.arg_bool)
print(type(args.arg_bool))

কমান্ড লাইন থেকে এই ফাইলটি চালান।

$ python argparse_type_bool.py True
True
<type 'bool'>

যদি true একটি যুক্তি হিসাবে ব্যবহার করা হয়, এটি একটি bool টাইপ true হিসাবে পড়া হবে। এটি প্রত্যাশিত আচরণ, কিন্তু সমস্যাটি নিম্নলিখিত ক্ষেত্রে।

$ python argparse_type_bool.py False
True
<type 'bool'>

$ python argparse_type_bool.py bar
True
<type 'bool'>

আপনি একটি যুক্তি হিসাবে মিথ্যা বা অন্য কোন স্ট্রিং ব্যবহার করলে, এটি সত্য হিসাবে পড়া হবে।

এটি হওয়ার কারণ হল যখন add_argument() এ type=xxx নির্দিষ্ট করা হয়, আর্গুমেন্টটি xxx() এ চলে যায়।

উদাহরণস্বরূপ, যদি type=int, আর্গুমেন্টটি int(); যদি type=float, তাহলে float()।

টাইপ=বুলের ক্ষেত্রেও একই কথা প্রযোজ্য, যার অর্থ হল আর্গুমেন্ট bool()-এ পাঠানো হবে।

বুল () দ্বারা বিচার

এই bool() একটি চতুর এক.

নিম্নলিখিত মানগুলি মিথ্যা বলে বিবেচিত হয়:

  • None
  • false
  • সাংখ্যিক প্রকারে শূন্য। উদাহরণস্বরূপ, নিম্নলিখিত মান
    • 0
    • 0
    • 0j
  • একটি খালি ক্রম. উদাহরণ স্বরূপ
    • ()
    • []
  • খালি ম্যাপিং। উদাহরণ স্বরূপ
    • {}

অন্যান্য সমস্ত মান সত্য বলে ধরে নেওয়া হয় – এইভাবে অনেক ধরণের বস্তু সর্বদা সত্য। অপারেশন এবং অন্তর্নির্মিত ফাংশনগুলি যেগুলি বুলিয়ান ফলাফলগুলি দেয় সেগুলি সর্বদা মিথ্যা মান হিসাবে 0 বা মিথ্যা এবং 1 বা সত্য সত্য মান হিসাবে প্রদান করে, যদি না অন্যথায় উল্লেখ করা হয়।

তাই, সমস্ত অ-খালি স্ট্রিং bool(-এ পাস করা হয়েছে, ‘সত্য’ বা ‘মিথ্যা’, সত্য ফিরে আসবে। শুধুমাত্র খালি স্ট্রিং মিথ্যা হবে.

print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True

print(bool(''))
# False

যখন add_argument() এ type=bool সেট করা হয়, আর্গুমেন্টটি bool() এ চলে যায়। সুতরাং, উপরের উদাহরণে দেখানো হয়েছে, যদি মিথ্যাকে যুক্তি হিসাবে ব্যবহার করা হয়, তাহলে এটি bool() দ্বারা স্ট্রিং ‘False’ হিসাবে রূপান্তরিত হবে এবং সত্য হিসাবে পড়বে।

আর্গুমেন্ট টাইপের পরিবর্তে আর্গুমেন্ট অ্যাকশন ব্যবহার করুন।

আপনি যদি আর্গপার্সে বুলিয়ান মান ব্যবহার করতে চান, আর্গুমেন্ট অ্যাকশনের জন্য ‘store_true’ বা ‘store_false’ উল্লেখ করুন।

  • store_true’
  • store_false’

এগুলি হবে ‘store_const’-এর বিশেষ সংস্করণ যা যথাক্রমে True এবং False সংরক্ষণ করবে। উপরন্তু, তারা ডিফল্ট মান যথাক্রমে False এবং True সেট করবে, সেই ক্রমে।
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--en', action='store_true')

args = parser.parse_args()
print(args.en)
print(type(args.en))

এই উদাহরণে, নিম্নলিখিত বিকল্প দেওয়া হয়.
--enতাই, যদি en কে সত্য হিসাবে সেট না করা হয় তবে এটি মিথ্যা হিসাবে লোড হবে, যা en এর ডিফল্ট মান।

$ python argparse_option_bool.py --en
True
<type 'bool'>

$ python argparse_option_bool.py
False
<type 'bool'>

আপনি যদি ডিফল্টকে সত্য এবং মিথ্যাতে সেট করতে চান যখন বিকল্পটি যোগ করা হয়, কেবল নিম্নলিখিতটি করুন।
action='store_false'

strtobool() ফাংশন ব্যবহার করে

আপনি বিকল্পের পরিবর্তে অবস্থানগত আর্গুমেন্ট ব্যবহার করতে চাইলে, আপনি strtobool() ফাংশনও ব্যবহার করতে পারেন।

strtobool() একটি ফাংশন যা একটি স্ট্রিংকে সত্য (1) বা মিথ্যা (0) তে রূপান্তর করে।

একটি বুলিয়ান স্ট্রিংকে সত্য (1) বা মিথ্যা (0) এ রূপান্তর করে।
প্রকৃত মান নিম্নরূপ

  • y
  • yes
  • true
  • on
  • 1

নিম্নরূপ মিথ্যা মান.

  • n
  • no
  • f
  • false
  • off
  • 0

যদি val উপরের কোনটি না হয় তবে এটি ValueError বাড়ায়।

9. API Reference – strtobool() — Python 3.10.0 Documentation

এটি কেস সংবেদনশীল নয়, তাই উদাহরণস্বরূপ, আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন; অন্য কোন স্ট্রিং একটি ত্রুটির ফলাফল হবে.

  • TRUE'
  • True'
  • YES'
from distutils.util import strtobool

print(strtobool('true'))
print(strtobool('True'))
print(strtobool('TRUE'))
# 1
# 1
# 1

print(strtobool('t'))
print(strtobool('yes'))
print(strtobool('y'))
print(strtobool('on'))
print(strtobool('1'))
# 1
# 1
# 1
# 1
# 1

print(strtobool('false'))
print(strtobool('False'))
print(strtobool('FALSE'))
# 0
# 0
# 0

print(strtobool('f'))
print(strtobool('no'))
print(strtobool('n'))
print(strtobool('off'))
print(strtobool('0'))
# 0
# 0
# 0
# 0
# 0

# print(strtobool('abc'))
# ValueError: invalid truth value 'abc'

নাম strtobool(), কিন্তু রিটার্ন মান bool নয়, কিন্তু int (1 বা 0)।

print(type(strtobool('true')))
# <class 'int'>

যেমনটি আগে লেখা হয়েছে, যখন argparse-এর add_argument() এ type=xxx নির্দিষ্ট করা হবে, আর্গুমেন্টটি xxx() এ চলে যাবে। অতএব, আমরা নিম্নলিখিত কাজ করতে পারেন.
type=strtobool

import argparse
from distutils.util import strtobool

parser = argparse.ArgumentParser()
parser.add_argument('arg_bool', type=strtobool)

args = parser.parse_args()
print(args.arg_bool)
print(type(args.arg_bool))

রিটার্ন মান একটি bool টাইপ নয়, কিন্তু একটি int টাইপ 1 বা 0, তবে এটি আর্গুমেন্ট হিসাবে সত্য বা মিথ্যা সহ সত্য বা মিথ্যা মান পড়তে পারে।

$ python argparse_type_strtobool.py true
1
<type 'int'>

$ python argparse_type_strtobool.py false
0
<type 'int'>

এছাড়াও, যুক্তি প্রত্যাশিত না হলে, একটি ত্রুটি সঠিকভাবে তৈরি করা হবে।

$ python argparse_type_strtobool.py bar
usage: argparse_type_strtobool.py [-h] arg_bool
argparse_type_strtobool.py: error: argument arg_bool: invalid strtobool value: 'bar'