Python च्या argparse मध्ये बुलियन मूल्यांशी व्यवहार करताना काळजी घ्या

व्यवसाय

Python मध्ये कमांड लाइन वितर्क हाताळण्यासाठी, sys मॉड्यूलचे argv किंवा argparse मॉड्यूल वापरा.

आर्गपार्स मॉड्यूल कमांड लाइन आर्ग्युमेंट्सच्या लवचिक हाताळणीसाठी परवानगी देतो, परंतु बुलियन व्हॅल्यू (सत्य, असत्य) हाताळताना काळजी घेणे आवश्यक आहे.

खालील माहिती येथे दिली आहे.

  • वितर्कांच्या सोप्या व्याख्येसाठी argparse
  • argparse सह युक्तिवादाचा प्रकार (प्रकार) निर्दिष्ट करा
  • add_argument() च्या वितर्क प्रकार म्हणून “बूल” निर्दिष्ट करू नका
  • bool() द्वारे निर्णय
  • वितर्क प्रकाराऐवजी युक्तिवाद क्रिया वापरा.
  • स्ट्रटोबूल() फंक्शन वापरणे

वितर्कांच्या सोप्या व्याख्येसाठी argparse

आर्गपार्स मॉड्यूल कमांड लाइन वितर्क परिभाषित करणे सोपे करते.

argparse मॉड्यूल वापरकर्त्यासाठी अनुकूल कमांड लाइन इंटरफेस तयार करणे सोपे करते. तुमच्या प्रोग्रामला कोणते वितर्क आवश्यक आहेत ते तुम्ही परिभाषित करता आणि sys.argv वरून ते पर्याय कसे पार्स करायचे हे argparse शोधून काढेल. 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 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'>

जर true हा वितर्क म्हणून वापरला असेल, तर तो bool type 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().

type=bool साठीही हेच खरे आहे, याचा अर्थ आर्ग्युमेंट bool() ला पास केले जाईल.

bool() द्वारे निर्णय

हे bool() अवघड आहे.

खालील मूल्ये असत्य मानली जातात:

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

इतर सर्व मूल्ये सत्य मानली जातात – अशा प्रकारे अनेक प्रकारच्या वस्तू नेहमी सत्य असतात. बुलियन परिणाम देणारी ऑपरेशन्स आणि बिल्ट-इन फंक्शन्स नेहमी 0 किंवा असत्य व्हॅल्यू म्हणून 0 किंवा असत्य आणि 1 किंवा ट्रू खरे व्हॅल्यू म्हणून रिटर्न करतात, अन्यथा लक्षात घेतल्याशिवाय.

त्यामुळे, ‘सत्य’ किंवा ‘असत्य’, bool( मध्ये पास केलेल्या सर्व नॉन-रिक्त स्ट्रिंग्स खरे असतील. फक्त रिकाम्या स्ट्रिंग खोट्या असतील.

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() एक फंक्शन आहे जे स्ट्रिंगला true (1) किंवा false (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'

नाव स्ट्रटोबूल(), परंतु रिटर्न व्हॅल्यू 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