धमनी के साथ बूलियन मूल्यों को पार्स करना


611

मैं "--foo True" या "--foo False" के रूप में लिखे गए बूलियन कमांड-लाइन तर्कों को पार्स करने के लिए उपयोग करना चाहूंगा। उदाहरण के लिए:

my_program --my_boolean_flag False

हालाँकि, निम्न परीक्षण कोड वह नहीं करता है जो मैं चाहूंगा:

import argparse
parser = argparse.ArgumentParser(description="My parser")
parser.add_argument("--my_bool", type=bool)
cmd_line = ["--my_bool", "False"]
parsed_args = parser.parse(cmd_line)

दुख की बात है, parsed_args.my_boolमूल्यांकन करता है True। जब मैं बदलता हूं, तब भी यही स्थिति होती cmd_lineहै ["--my_bool", ""], जो कि आश्चर्यजनक है, क्योंकि यह bool("")विकसित होता है False

मैं कैसे argparse पार्स करने के लिए प्राप्त कर सकते हैं "False", "F", और उनके लोअर केस होने की वेरिएंट False?


40
यहाँ @ mgilson के उत्तर की एक-लाइनर व्याख्या है parser.add_argument('--feature', dest='feature', default=False, action='store_true')। यह समाधान की गारंटी होगा आप हमेशा एक मिल boolमूल्य के साथ प्रकार Trueया False। (इस समाधान में एक बाधा है: आपके विकल्प का डिफ़ॉल्ट मान होना चाहिए।)
ट्रेवर बॉयड स्मिथ

7
यहाँ @ मैक्सिम के उत्तर की एक-लाइनर व्याख्या है parser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))। जब विकल्प प्रयोग किया जाता है, इसलिए यह समाधान सुनिश्चित करेगा boolके मूल्य के साथ प्रकार Trueया False। जब विकल्प का उपयोग नहीं किया जाता है तो आपको मिलेगा None। ( distutils.util.strtobool(x)एक अन्य स्टैकओवरफ्लो प्रश्न से है )
ट्रेवर बॉयड स्मिथ

8
कैसे के बारे में कुछ की तरहparser.add_argument('--my_bool', action='store_true', default=False)
AruniRC

जवाबों:


272

फिर भी पिछले सुझावों का उपयोग कर एक और समाधान, लेकिन "सही" पार्स त्रुटि से argparse:

def str2bool(v):
    if isinstance(v, bool):
       return v
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Boolean value expected.')

डिफ़ॉल्ट मानों के साथ स्विच करने के लिए यह बहुत उपयोगी है; उदाहरण के लिए

parser.add_argument("--nice", type=str2bool, nargs='?',
                        const=True, default=False,
                        help="Activate nice mode.")

मुझे उपयोग करने की अनुमति देता है:

script --nice
script --nice <bool>

और अभी भी एक डिफ़ॉल्ट मान (उपयोगकर्ता सेटिंग्स के लिए विशिष्ट) का उपयोग करें। उस दृष्टिकोण के साथ एक (अप्रत्यक्ष रूप से संबंधित) नकारात्मक यह है कि 'नर्ग' एक स्थितिगत तर्क को पकड़ सकता है - देखें इस संबंधित प्रश्न और इस बग रिपोर्ट को देखें


4
nargs = '?' शून्य या एक तर्क का मतलब है। docs.python.org/3/library/argparse.html#nargs
Maxim

1
मुझे यह पसंद है, लेकिन मेरी डिफ़ॉल्ट = एनआईसीई मुझे एक त्रुटि दे रही है, इसलिए मुझे कुछ और करने की आवश्यकता है।
माइकल मैथ्यू

2
@MarcelloRomani str2bool पायथन अर्थ में एक प्रकार नहीं है, यह ऊपर परिभाषित फ़ंक्शन है, आपको इसे कहीं और शामिल करने की आवश्यकता है।
मैक्सिम

4
के कोड के str2bool(v)साथ प्रतिस्थापित किया जा सकता है bool(distutils.util.strtobool(v))। स्रोत: stackoverflow.com/a/18472142/2436175
एंटोनियो

4
शायद यह ध्यान देने योग्य है कि इस तरह से आप यह जांच नहीं कर सकते हैं कि यदि तर्क if args.nice:गलत तरीके से सेट किया गया है यदि तर्क गलत पर सेट है, तो यह कभी भी शर्त को पारित नहीं करेगा। यदि यह सही है तो शायद यह से लौटने सूची में बेहतर है str2boolसमारोह और के रूप में सेट की सूची constपैरामीटर, इस तरह [True], [False]। अगर मैं गलत हूं तो मुझे सही करें
NutCracker

886

मुझे लगता है कि यह करने के लिए एक अधिक विहित तरीका है:

command --feature

तथा

command --no-feature

argparse इस संस्करण का अच्छी तरह से समर्थन करता है:

parser.add_argument('--feature', dest='feature', action='store_true')
parser.add_argument('--no-feature', dest='feature', action='store_false')
parser.set_defaults(feature=True)

बेशक, यदि आप वास्तव में --arg <True|False>संस्करण चाहते हैं, तो आप ast.literal_eval"प्रकार", या उपयोगकर्ता परिभाषित फ़ंक्शन के रूप में पास कर सकते हैं ...

def t_or_f(arg):
    ua = str(arg).upper()
    if 'TRUE'.startswith(ua):
       return True
    elif 'FALSE'.startswith(ua):
       return False
    else:
       pass  #error condition maybe?

96
मुझे अभी भी लगता type=boolहै कि बॉक्स से बाहर काम करना चाहिए (स्थिति संबंधी तर्कों पर विचार करें!)। जब आप अतिरिक्त रूप से निर्दिष्ट करते हैं choices=[False,True], तब भी आप "गलत" और "ट्रू" दोनों को सत्य मानते हैं (एक कलाकार से बूल तक?)। शायद संबंधित मुद्दा
डॉल्फिन

41
ठीक है, मुझे लगता है कि इस उम्मीद के मुताबिक काम नहीं करने का कोई औचित्य नहीं है। और यह बेहद भ्रामक है, क्योंकि इसमें न तो सुरक्षा जांच होती है और न ही त्रुटि संदेश।
डॉल्फिन

69
@mgilson - मुझे जो भ्रामक लगता है वह यह है कि आप टाइप = बूल सेट कर सकते हैं , आपको कोई त्रुटि संदेश नहीं मिलता है, और फिर भी, "गलत" और "ट्रू" दोनों प्रकार के तर्कों के लिए, आप अपने कथित बूलियन वेरिएबल में ट्रू करें (कारण के अनुसार) टाइपिंग का काम अजगर में होता है)। तो या तो प्रकार = बूल स्पष्ट रूप से असमर्थित होना चाहिए (कुछ चेतावनी, त्रुटि, आदि का उत्सर्जन करें), या इसे इस तरह से काम करना चाहिए जो उपयोगी और सहज रूप से अपेक्षित हो।
डॉल्फिन

14
@ डॉल्फिन - क्रमशः, मैं असहमत हूं। मुझे लगता है कि व्यवहार ठीक उसी तरह है जैसे यह होना चाहिए और अजगर के ज़ेन के अनुरूप है "विशेष मामले नियमों को तोड़ने के लिए विशेष नहीं हैं"। हालांकि, यदि आप इसे इसके बारे में दृढ़ता से महसूस करते हैं, तो इसे विभिन्न अजगर मेलिंग सूचियों में से एक पर क्यों नहीं लाया जाए ? वहाँ, आप कोई है जो करने की शक्ति है समझाने के लिए एक मौका हो सकता है कर इस मुद्दे के बारे में कुछ। यहां तक ​​कि अगर आप मुझे समझाने में सक्षम थे, तो आप केवल मुझे समझाने में सफल होंगे और व्यवहार अभी भी नहीं बदलेगा क्योंकि मैं एक देव नहीं हूं :)
mgilson

15
क्या हम इस बारे में बहस कर रहे हैं कि पायथन bool()फंक्शन को क्या करना चाहिए, या किस तरह के विवाद को स्वीकार करना चाहिए type=fn? सभी argparseजाँचों को fnकॉल करने योग्य है। यह fnएक स्ट्रिंग तर्क लेने की उम्मीद करता है, और एक मूल्य लौटाता है। का व्यवहार fnप्रोग्रामर की जिम्मेदारी है, नहीं argparse's
हंपुलज

235

मैं, लेकिन एक पारस्परिक रूप से विशिष्ट समूह के साथ mgilson के जवाब की सलाह देते हैं
, ताकि आप उपयोग नहीं कर सकते --featureऔर --no-featureएक ही समय में।

command --feature

तथा

command --no-feature

लेकिन नहीं

command --feature --no-feature

स्क्रिप्ट:

feature_parser = parser.add_mutually_exclusive_group(required=False)
feature_parser.add_argument('--feature', dest='feature', action='store_true')
feature_parser.add_argument('--no-feature', dest='feature', action='store_false')
parser.set_defaults(feature=True)

यदि आप उनमें से कई सेट करने जा रहे हैं तो आप इस सहायक का उपयोग कर सकते हैं:

def add_bool_arg(parser, name, default=False):
    group = parser.add_mutually_exclusive_group(required=False)
    group.add_argument('--' + name, dest=name, action='store_true')
    group.add_argument('--no-' + name, dest=name, action='store_false')
    parser.set_defaults(**{name:default})

add_bool_arg(parser, 'useful-feature')
add_bool_arg(parser, 'even-more-useful-feature')

5
@CharlieParker के add_argumentसाथ कहा जाता है dest='feature'set_defaultsके साथ कहा जाता है feature=True। समझना?
fnkr

4
यह या mgilson का उत्तर स्वीकृत उत्तर होना चाहिए था - भले ही ओपी चाहता था --flag False, एसओ जवाब का हिस्सा होना चाहिए कि वे कैसे हल करने की कोशिश कर रहे हैं, न कि केवल एचओवी के बारे में। ऐसा करने का कोई कारण नहीं होना चाहिए --flag Falseया --other-flag Trueफिर कुछ कस्टम पार्सर का उपयोग करके स्ट्रिंग को बूलियन में परिवर्तित किया जा सकता है .. action='store_true'और action='store_false'बूलियन झंडे का उपयोग करने का सबसे अच्छा तरीका है
kevlarr

6
@cowlinator एसओ आखिरकार "सवालों के जवाब के रूप में" कहा गया है? अपने स्वयं के दिशानिर्देशों के अनुसार , एक एवर ... can be “don’t do that”, but it should also include “try this instead”जो (कम से कम मेरे लिए) का अर्थ है उत्तर उपयुक्त होने पर गहराई से जाना चाहिए। निश्चित रूप से ऐसे समय होते हैं जब हम में से कुछ पोस्टिंग बेहतर / सर्वोत्तम प्रथाओं, आदि पर मार्गदर्शन से लाभ उठा सकते हैं .. जवाब "जैसा कि कहा गया है" अक्सर ऐसा नहीं करता है। यह कहा जा रहा है, जवाब के साथ आपकी हताशा अक्सर बहुत अधिक (या गलत तरीके से) मानती है पूरी तरह से वैध है।
केवलर

2
यदि कोई उपयोगकर्ता के लिए एक तीसरा मान रखना चाहता है, जब उसने स्पष्ट रूप से सुविधा निर्दिष्ट नहीं की है, तो उसे अंतिम पंक्ति को बदलने की आवश्यकता हैparser.set_defaults(feature=None)
एलेक्स चे

2
यदि हम help=इस तर्क के लिए एक प्रविष्टि जोड़ना चाहते हैं , तो इसे कहां जाना चाहिए? में add_mutually_exclusive_group()कॉल? एक या दोनों add_argument()कॉल में? कहीं और?
केन विलियम्स

57

यहां डिफ़ॉल्ट मान सेट करने के लिए अतिरिक्त पंक्ति / एस के बिना एक और भिन्नता है। बूल का हमेशा एक मान होता है, ताकि इसे बिना पूर्व जांच के तार्किक बयानों में इस्तेमाल किया जा सके।

import argparse
parser = argparse.ArgumentParser(description="Parse bool")
parser.add_argument("--do-something", default=False, action="store_true" , help="Flag to do something")
args = parser.parse_args()

if args.do_something:
     print("Do something")
else:
     print("Don't do something")
print("Check that args.do_something=" + str(args.do_something) + " is always a bool")

5
यह उत्तर कमतर है, लेकिन अपनी सादगी में अद्भुत है। सेट करने की कोशिश मत करो required=Trueवरना आपको हमेशा ट्रू आर्ग मिलेगा।
गैरेन एस

1
कृपया कभी bool या nonetype जैसी चीजों पर समानता ऑपरेटर का उपयोग करें। आपको इसके बजाय IS का उपयोग करना चाहिए
webKnjaZ

2
यह स्वीकृत की तुलना में बेहतर उत्तर है क्योंकि यह केवल निरर्थक बूलियन स्ट्रिंग की आवश्यकता के बजाय बूलियन मान सेट करने के लिए ध्वज की उपस्थिति के लिए जाँच करता है। (यो Dawg, मैं तुम्हें बूलियन्स की तरह सुना ... इसलिए मैं आप अपने बूलियन सेट करने के लिए अपने बूलियन साथ एक बूलियन दिया!)
साइफन

4
हम्म ... सवाल, जैसा कि कहा गया है, कमांड लाइन पर "ट्रू" / "गलत" का उपयोग करना चाहते हैं; हालांकि इस उदाहरण के साथ, python3 test.py --do-something Falseविफल रहता है error: unrecognized arguments: False, इसलिए यह वास्तव में सवाल का जवाब नहीं देता है।
sdbbs 10

38

एक लाइन:

parser.add_argument('--is_debug', default=False, type=lambda x: (str(x).lower() == 'true'))

4
ऑनलाइनर प्रशंसक के लिए अच्छा है, यह भी थोड़ा सुधार किया जा सकता है:type=lambda x: (str(x).lower() in ['true','1', 'yes'])
Tu Bui

35

वहाँ के रूप में कुछ भ्रम हो सकता है लगता है type=boolऔर क्या type='bool'मतलब हो सकता है। क्या एक (या दोनों) का अर्थ है 'फंक्शन चलाना bool(), या' बूलियन वापस करना '? जैसा कि खड़ा है type='bool'इसका मतलब कुछ भी नहीं है। add_argumentएक 'bool' is not callableत्रुटि देता है , जैसे कि आपने उपयोग किया है type='foobar', या type='int'

लेकिन argparseक्या आपके पास रजिस्ट्री है जो आपको इस तरह से कीवर्ड परिभाषित करने देती है। यह ज्यादातर के लिए प्रयोग किया जाता है action, उदाहरण के लिए `कार्रवाई = 'store_true'। आप इसके साथ पंजीकृत कीवर्ड देख सकते हैं:

parser._registries

जो एक शब्दकोश प्रदर्शित करता है

{'action': {None: argparse._StoreAction,
  'append': argparse._AppendAction,
  'append_const': argparse._AppendConstAction,
...
 'type': {None: <function argparse.identity>}}

बहुत सारी क्रियाएं परिभाषित हैं, लेकिन केवल एक प्रकार, डिफ़ॉल्ट एक है argparse.identity

यह कोड 'बूल' कीवर्ड को परिभाषित करता है:

def str2bool(v):
  #susendberg's function
  return v.lower() in ("yes", "true", "t", "1")
p = argparse.ArgumentParser()
p.register('type','bool',str2bool) # add type keyword to registries
p.add_argument('-b',type='bool')  # do not use 'type=bool'
# p.add_argument('-b',type=str2bool) # works just as well
p.parse_args('-b false'.split())
Namespace(b=False)

parser.register()प्रलेखित नहीं है, लेकिन यह भी छिपा नहीं है। अधिकांश भाग के लिए प्रोग्रामर इसके बारे में क्योंकि पता करने की जरूरत नहीं है typeऔर actionले समारोह और वर्ग मूल्यों। दोनों के लिए कस्टम मानों को परिभाषित करने के ढेर सारे ढेर सारे उदाहरण हैं।


यदि यह पिछली चर्चा से स्पष्ट नहीं है, bool()तो इसका अर्थ 'पार्स ए स्ट्रिंग' नहीं है। पायथन प्रलेखन से:

बूल (x): मानक सत्य परीक्षण प्रक्रिया का उपयोग करके एक बूलियन के लिए एक मान बदलें।

इसके विपरीत

int (x): किसी संख्या या स्ट्रिंग x को पूर्णांक में बदलें।


3
या उपयोग करें: parser.register ('प्रकार', 'बूल', (लैम्ब्डा x: x.lower () इन ("हाँ", "सत्य", "t", "1")))
मैटीज़

17

मैं एक ही मुद्दे के लिए देख रहा था, और सुंदर समाधान imho है:

def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

और ऊपर बताए अनुसार बूलियन को स्ट्रिंग पार्स करने के लिए इसका उपयोग करना।


5
यदि आप इस मार्ग पर जाने वाले हैं, तो मैं सुझाव दूंगा distutils.util.strtobool(v)
CivFan

1
distutils.util.strtoboolरिटर्न 1 या 0, न कि वास्तविक बूलियन।
CMCDragonkai

14

उपयोग करने के लिए एक समान तरीका है:

feature.add_argument('--feature',action='store_true')

और यदि आप अपने आदेश में तर्क सेट करते हैं -

 command --feature

यह तर्क सही होगा, यदि आप प्रकार सेट नहीं करते हैं - तर्क को डिफ़ॉल्ट मानें तो हमेशा गलत है!


1
क्या इस पद्धति में कुछ खामी है जिससे अन्य उत्तर दूर हो जाते हैं? ऐसा लगता है कि ओपी (और इस मामले में) जो चाहता था, वह अब तक का सबसे आसान, सबसे आसान समाधान है। मुझे यह पसंद है।
सिमोन ओ'हलान 21

2
जबकि सरल, यह सवाल का जवाब नहीं है। ओपी एक तर्क चाहता है जहां आप निर्दिष्ट कर सकते हैं--feature False
अस्त्रियुल

12

@Mgilson ने जो कहा, इसके अलावा, यह ध्यान दिया जाना चाहिए कि एक ऐसी ArgumentParser.add_mutually_exclusive_group(required=False)विधि भी है जो इसे लागू करने के लिए तुच्छ बनाती है --flagऔर --no-flagउसी समय इसका उपयोग नहीं किया जाता है।


11

यह सब कुछ के लिए काम करता है जो मुझे इसकी उम्मीद है:

add_boolean_argument(parser, 'foo', default=True)
parser.parse_args([])                   # Whatever the default was
parser.parse_args(['--foo'])            # True
parser.parse_args(['--nofoo'])          # False
parser.parse_args(['--foo=true'])       # True
parser.parse_args(['--foo=false'])      # False
parser.parse_args(['--foo', '--nofoo']) # Error

कोड:

def _str_to_bool(s):
    """Convert string to bool (in argparse context)."""
    if s.lower() not in ['true', 'false']:
        raise ValueError('Need bool; got %r' % s)
    return {'true': True, 'false': False}[s.lower()]

def add_boolean_argument(parser, name, default=False):                                                                                               
    """Add a boolean argument to an ArgumentParser instance."""
    group = parser.add_mutually_exclusive_group()
    group.add_argument(
        '--' + name, nargs='?', default=default, const=True, type=_str_to_bool)
    group.add_argument('--no' + name, dest=name, action='store_false')

अति उत्कृष्ट! मैं इस जवाब के साथ जा रहा हूँ। मैंने एक बार _str_to_bool(s)कन्वर्ट करने के लिए अपना ट्विट किया s = s.lower(), फिर टेस्ट किया if s not in {'true', 'false', '1', '0'}और आखिर में return s in {'true', '1'}
जेरी १०

6

एक सरल तरीका नीचे के रूप में उपयोग किया जाएगा।

parser.add_argument('--feature', type=lambda s: s.lower() in ['true', 't', 'yes', '1'])

5

सरल। यह लचीला नहीं है, लेकिन मैं सादगी पसंद करता हूं।

  parser.add_argument('--boolean_flag',
                      help='This is a boolean flag.',
                      type=eval, 
                      choices=[True, False], 
                      default='True')

संपादित करें: यदि आप इनपुट पर भरोसा नहीं करते हैं, तो उपयोग न करें eval


यह काफी सुविधाजनक लगता है। मैंने देखा कि आप टाइप के रूप में विकसित हुए हैं। मेरा इस बारे में एक सवाल था: कैसे स्पष्ट होना चाहिए, या इसका उपयोग करने के लिए आयात की आवश्यकता है?
एडीज़

1
evalएक अंतर्निहित कार्य है। docs.python.org/3/library/functions.html#eval यह कोई भी अनियंत्रित कार्य हो सकता है जो अन्य, अधिक लचीले दृष्टिकोणों का लाभ उठाते हैं।
1

अरे, यह तो बहुत अच्छा है। धन्यवाद!
edesz

1
यह प्यारा है, लेकिन सिर्फ उन जंगली में डालना काफी जोखिम भरा है जहां उपयोगकर्ताओं को जो बुराई से बचने के बारे में जानते नहीं हैं, वे इसे अपनी स्क्रिप्ट में कॉपी-पेस्ट करेंगे।
आर्न

@Arne, अच्छी बात है। हालाँकि, ऐसा प्रतीत होता है कि किसी सुविचारित उपयोगकर्ता के लिए यह आकस्मिक रूप से कठिन होगा कि वह कुछ गलत कर सके।
रसेल

3

उपयोग करने के लिए सबसे सरल तरीका होगा विकल्पों :

parser = argparse.ArgumentParser()
parser.add_argument('--my-flag',choices=('True','False'))

args = parser.parse_args()
flag = args.my_flag == 'True'
print(flag)

पास नहीं हो रहा है - मेरा-ध्वज गलत का मूल्यांकन करता है। आवश्यक = सच विकल्प है यदि आप हमेशा उपयोगकर्ता स्पष्ट रूप से एक विकल्प निर्दिष्ट करना चाहते हैं जोड़ा जा सकता है।



1
class FlagAction(argparse.Action):
    # From http://bugs.python.org/issue8538

    def __init__(self, option_strings, dest, default=None,
                 required=False, help=None, metavar=None,
                 positive_prefixes=['--'], negative_prefixes=['--no-']):
        self.positive_strings = set()
        self.negative_strings = set()
        for string in option_strings:
            assert re.match(r'--[A-z]+', string)
            suffix = string[2:]
            for positive_prefix in positive_prefixes:
                self.positive_strings.add(positive_prefix + suffix)
            for negative_prefix in negative_prefixes:
                self.negative_strings.add(negative_prefix + suffix)
        strings = list(self.positive_strings | self.negative_strings)
        super(FlagAction, self).__init__(option_strings=strings, dest=dest,
                                         nargs=0, const=None, default=default, type=bool, choices=None,
                                         required=required, help=help, metavar=metavar)

    def __call__(self, parser, namespace, values, option_string=None):
        if option_string in self.positive_strings:
            setattr(namespace, self.dest, True)
        else:
            setattr(namespace, self.dest, False)

1

सबसे सरल और सबसे सही तरीका है

from distutils import util
arser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))

ध्यान दें कि सच्चे मूल्य y, हां, t, सत्य, चालू और 1 हैं; गलत मान n, no, f, false, off और 0. वैल्यू है, तो वैल कुछ और है।


0

त्वरित और आसान, लेकिन केवल तर्क 0 या 1 के लिए:

parser.add_argument("mybool", default=True,type=lambda x: bool(int(x)))
myargs=parser.parse_args()
print(myargs.mybool)

टर्मिनल से कॉल करने के बाद आउटपुट "गलत" होगा:

python myscript.py 0

-1

@ आकाश के समान लेकिन यहाँ एक और तरीका है जिसका मैंने उपयोग किया है। इसका उपयोग इसलिए किया जाता strहै lambdaक्योंकि अजगर lambdaहमेशा मुझे एक विदेशी-भावना देता है।

import argparse
from distutils.util import strtobool

parser = argparse.ArgumentParser()
parser.add_argument("--my_bool", type=str, default="False")
args = parser.parse_args()

if bool(strtobool(args.my_bool)) is True:
    print("OK")

-1

@ आकाश देसर्दा के जवाब में सुधार के रूप में, आप कर सकते हैं

import argparse
from distutils.util import strtobool

parser = argparse.ArgumentParser()
parser.add_argument("--foo", 
    type=lambda x:bool(strtobool(x)),
    nargs='?', const=True, default=False)
args = parser.parse_args()
print(args.foo)

और यह समर्थन करता है python test.py --foo

(base) [costa@costa-pc code]$ python test.py
False
(base) [costa@costa-pc code]$ python test.py --foo 
True
(base) [costa@costa-pc code]$ python test.py --foo True
True
(base) [costa@costa-pc code]$ python test.py --foo False
False
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.