पाइथन के argparse में बूलियन मानों से निपटने में सावधान रहें

व्यापार

पायथन में कमांड लाइन तर्कों को संभालने के लिए, sys मॉड्यूल के argv या argparse मॉड्यूल का उपयोग करें।

Argparse मॉड्यूल कमांड लाइन तर्कों की लचीली हैंडलिंग की अनुमति देता है, लेकिन बूलियन मानों (सत्य, गलत) से निपटने के दौरान सावधानी बरतनी चाहिए।

निम्नलिखित जानकारी यहाँ प्रदान की गई है।

  • तर्कों की आसान परिभाषा के लिए argparse
  • तर्क के प्रकार (प्रकार) को argparse के साथ निर्दिष्ट करें
  • add_argument () के तर्क प्रकार के रूप में “बूल” निर्दिष्ट न करें
  • बूल द्वारा निर्णय ()
  • तर्क प्रकार के बजाय तर्क क्रिया का प्रयोग करें।
  • स्ट्रेटोबूल () फ़ंक्शन का उपयोग करना

तर्कों की आसान परिभाषा के लिए argparse

Argparse मॉड्यूल कमांड लाइन तर्कों को परिभाषित करना आसान बनाता है।

Argparse मॉड्यूल उपयोगकर्ता के अनुकूल कमांड लाइन इंटरफेस बनाना आसान बनाता है। आप परिभाषित करते हैं कि आपके प्रोग्राम को किन तर्कों की आवश्यकता है, और argparse यह पता लगाएगा कि sys.argv से उन विकल्पों को कैसे पार्स किया जाए। argparse मॉड्यूल स्वचालित रूप से सहायता और उपयोग संदेश उत्पन्न करता है, और यदि उपयोगकर्ता प्रोग्राम के लिए अमान्य तर्क निर्दिष्ट करता है तो एक त्रुटि उत्पन्न करता है। त्रुटि जब उपयोगकर्ता प्रोग्राम के लिए अमान्य तर्क निर्दिष्ट करता है।
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

तर्क के प्रकार (प्रकार) को argparse के साथ निर्दिष्ट करें

Argparse की एक उपयोगी विशेषता प्रकार (प्रकार) निर्दिष्ट करना है।

उदाहरण के लिए, यदि आप एक पूर्णांक (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 को इंट के रूप में पढ़ा जाता है।

यदि तर्क के रूप में गैर-इंट मान का उपयोग किया जाता है, तो एक त्रुटि उत्पन्न होगी।

$ 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 () के तर्क प्रकार के रूप में “बूल” निर्दिष्ट न करें

यह ध्यान रखना महत्वपूर्ण है कि यदि आप बूल को add_argument() के तर्क प्रकार के रूप में निर्दिष्ट करते हैं, तो int और float की तरह बूल अपेक्षित रूप से काम नहीं करेगा।

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

यदि सत्य का उपयोग तर्क के रूप में किया जाता है, तो इसे बूल प्रकार सत्य के रूप में पढ़ा जाएगा। यह अपेक्षित व्यवहार है, लेकिन समस्या निम्न स्थिति है।

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

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

यदि आप तर्क के रूप में असत्य या किसी अन्य स्ट्रिंग का उपयोग करते हैं, तो इसे सत्य के रूप में पढ़ा जाएगा।

ऐसा होने का कारण यह है कि जब add_argument() में type=xxx निर्दिष्ट किया जाता है, तो तर्क xxx() को पास कर दिया जाता है।

उदाहरण के लिए, यदि टाइप = इंट, तर्क को इंट () में पास किया जाएगा; अगर टाइप = फ्लोट, फिर फ्लोट ()।

टाइप = बूल के लिए भी यही सच है, जिसका अर्थ है कि तर्क बूल () को पास कर दिया जाएगा।

बूल द्वारा निर्णय ()

यह बूल() एक मुश्किल है।

निम्नलिखित मानों को गलत माना जाता है:

  • None
  • false
  • संख्यात्मक प्रकारों में शून्य। उदाहरण के लिए, निम्नलिखित मान
    • 0
    • 0
    • 0j
  • एक खाली क्रम। उदाहरण के लिए
    • ()
    • []
  • खाली मैपिंग। उदाहरण के लिए
    • {}

अन्य सभी मूल्यों को सत्य माना जाता है – इस प्रकार कई प्रकार की वस्तुएं हमेशा सत्य होती हैं। संचालन और अंतर्निहित फ़ंक्शन जो बूलियन परिणाम लौटाते हैं, हमेशा 0 या गलत को गलत मान के रूप में और 1 या सही को सही मान के रूप में लौटाते हैं, जब तक कि अन्यथा नोट न किया गया हो।

इसलिए, सभी गैर-रिक्त तार बूल (), चाहे ‘सत्य’ या ‘गलत’ को पारित किए गए, सत्य वापस आ जाएंगे। केवल खाली तार झूठे होंगे।

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

print(bool(''))
# False

जब टाइप = बूल add_argument () में सेट होता है, तो तर्क बूल () को पास कर दिया जाता है। इसलिए, जैसा कि ऊपर के उदाहरण में दिखाया गया है, यदि तर्क के रूप में गलत का उपयोग किया जाता है, तो इसे बूल () द्वारा स्ट्रिंग ‘गलत’ के रूप में परिवर्तित किया जाएगा और सत्य के रूप में पढ़ा जाएगा।

तर्क प्रकार के बजाय तर्क क्रिया का प्रयोग करें।

यदि आप Argparse में बूलियन मानों का उपयोग करना चाहते हैं, तो तर्क क्रिया के लिए ‘store_true’ या ‘store_false’ निर्दिष्ट करें।

  • store_true’
  • store_false’

ये ‘store_const’ के विशेष संस्करण होंगे जो क्रमशः True और False को स्टोर करेंगे। इसके अलावा, वे डिफ़ॉल्ट मानों को क्रमशः उसी क्रम में गलत और सही पर सेट करेंगे।
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इसलिए, यदि एन को सत्य के रूप में सेट नहीं किया गया है, तो इसे गलत के रूप में लोड किया जाएगा, जो कि एन का डिफ़ॉल्ट मान है।

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

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

यदि आप विकल्प जोड़े जाने पर डिफ़ॉल्ट को सही और गलत पर सेट करना चाहते हैं, तो बस निम्न कार्य करें।
action='store_false'

स्ट्रेटोबूल () फ़ंक्शन का उपयोग करना

यदि आप विकल्पों के बजाय स्थितीय तर्कों का उपयोग करना चाहते हैं, तो आप फ़ंक्शन स्ट्रेटोबूल () का भी उपयोग कर सकते हैं।

स्ट्रेटोबूल () एक ऐसा फ़ंक्शन है जो एक स्ट्रिंग को सत्य (1) या गलत (0) में परिवर्तित करता है।

एक बूलियन स्ट्रिंग को सत्य (1) या गलत (0) में परिवर्तित करता है।
सही मान इस प्रकार हैं

  • y
  • yes
  • true
  • on
  • 1

असत्य मान इस प्रकार हैं।

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

यदि वैल उपरोक्त में से कोई नहीं है, तो यह 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'

नाम स्ट्रेटोबूल () है, लेकिन वापसी मूल्य बूल नहीं है, लेकिन int (1 या 0) है।

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

जैसा कि पहले लिखा गया है, जब टाइप = xxx को argparse के add_argument () में निर्दिष्ट किया जाता है, तो तर्क 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))

वापसी मूल्य एक बूल प्रकार नहीं है, लेकिन एक 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'