Python کے argparse میں بولین اقدار کے ساتھ کام کرتے وقت محتاط رہیں

کاروبار

Python میں کمانڈ لائن آرگیومینٹس کو ہینڈل کرنے کے لیے، sys ماڈیول کے argv یا argparse ماڈیول استعمال کریں۔

آرگ پارس ماڈیول کمانڈ لائن آرگیومینٹس کی لچکدار ہینڈلنگ کی اجازت دیتا ہے، لیکن بولین اقدار (سچ، غلط) کے ساتھ کام کرتے وقت احتیاط برتنی چاہیے۔

درج ذیل معلومات یہاں فراہم کی گئی ہیں۔

  • دلائل کی آسان تعریف کے لیے argparse
  • آرگ پارس کے ساتھ دلیل کی قسم (قسم) کی وضاحت کریں۔
  • add_argument() کی دلیل کی قسم کے طور پر "بول” کی وضاحت نہ کریں۔
  • فیصلہ بذریعہ bool()
  • دلیل کی قسم کے بجائے دلیل ایکشن استعمال کریں۔
  • strtobool() فنکشن کا استعمال

دلائل کی آسان تعریف کے لیے 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 کے طور پر پڑھا جاتا ہے۔

اگر ایک غیر انٹ ویلیو کو بطور دلیل استعمال کیا جاتا ہے تو، ایک خرابی واقع ہوگی۔

$ 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، توقع کے مطابق کام نہیں کرے گا اگر آپ bool کو add_argument() کی دلیل کی قسم کے طور پر بیان کرتے ہیں۔

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'>

اگر سچ کو دلیل کے طور پر استعمال کیا جاتا ہے، تو اسے 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() کو بھیج دی جائے گی۔

فیصلہ بذریعہ bool()

یہ bool() ایک مشکل ہے۔

درج ذیل اقدار کو غلط سمجھا جاتا ہے:

  • None
  • false
  • عددی اقسام میں صفر۔ مثال کے طور پر، درج ذیل اقدار
    • 0
    • 0
    • 0j
  • ایک خالی ترتیب۔ مثال کے طور پر
    • ()
    • []
  • خالی میپنگ۔ مثال کے طور پر
    • {}

دیگر تمام اقدار کو درست سمجھا جاتا ہے – اس طرح بہت سی اقسام کی اشیاء ہمیشہ سچ ہوتی ہیں۔ آپریشنز اور بلٹ ان فنکشنز جو بولین کے نتائج واپس کرتے ہیں ہمیشہ 0 یا False کو غلط ویلیو کے طور پر اور 1 یا True کو حقیقی قدر کے طور پر واپس کرتے ہیں، جب تک کہ دوسری صورت میں نوٹ نہ کیا جائے۔

لہٰذا، تمام غیر خالی سٹرنگز bool(، چاہے ‘true’ یا ‘false’، صحیح میں واپس آئیں گی۔ صرف خالی تاریں غلط ہوں گی۔

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

print(bool(''))
# False

جب type=bool کو add_argument() میں سیٹ کیا جاتا ہے، تو دلیل کو 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() فنکشن کا استعمال

اگر آپ اختیارات کے بجائے پوزیشنل آرگیومینٹس استعمال کرنا چاہتے ہیں تو آپ فنکشن strttobool() بھی استعمال کر سکتے ہیں۔

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'
Copied title and URL