আরগপার্সের সাথে বুলিয়ান মানগুলি পার্সিং করা হচ্ছে


610

আমি "--ফু ট্রু" বা "--ফু ফালস" হিসাবে লিখিত বুলিয়ান কমান্ড-লাইন যুক্তিগুলি পার্স করতে আরগপার্স ব্যবহার করতে চাই। উদাহরণ স্বরূপ:

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
এখানে @ মিলিলসনের উত্তরের এক-লাইন ব্যাখ্যা 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)
অরুনিআরসি

উত্তর:


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
ম্যাক্সিম

1
আমি এটি ভালবাসি, তবে আমার ডিফল্ট = Nice এর সমতুল্য আমাকে ত্রুটি দিচ্ছে, তাই আমার অন্য কিছু করা দরকার।
মাইকেল ম্যাথিউজ

2
@ মার্সেলোরোমনী স্ট্রিমুল পাইথন অর্থে কোনও প্রকার নয়, এটি উপরে বর্ণিত ফাংশন, আপনার এটি অন্য কোথাও অন্তর্ভুক্ত করা দরকার।
ম্যাক্সিম

4
এর কোডটি str2bool(v)প্রতিস্থাপন করা যেতে পারে bool(distutils.util.strtobool(v))। সূত্র: স্ট্যাকওভারফ্লো.com
অ্যান্টোনিও

4
হতে পারে এটি উল্লেখ করার মতো বিষয় যে এইভাবে আপনি যদি if args.nice:তর্কটি মিথ্যাতে সেট করে থাকে তবে বিকেজ দিয়ে আর্গুমেন্ট সেট করা আছে কিনা তা আপনি পরীক্ষা করতে পারবেন না , এটি কখনই শর্তটি পাস করবে না। এটিকে যদি সঠিক তারপর হয়তো এটা থেকে ফিরে লিস্টে উত্তম str2boolফাংশন এবং যেমন সেট তালিকা constপরামিতি, ভালো [True], [False]। আমি ভুল হলে আমাকে সংশোধন করুন
নিউট্র্যাকার

885

আমি মনে করি এটি করার আরও একটি প্রচলিত উপায় হল এর মাধ্যমে:

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
@ এমগিলসন - আমি যেটি বিভ্রান্তিকর পেয়েছি তা হ'ল আপনি টাইপ = বুল সেট করতে পারেন , আপনি কোনও ত্রুটি বার্তা পাবেন না এবং এখনও "মিথ্যা" এবং "সত্য" স্ট্রিং উভয়ের যুক্তির জন্যই আপনি আপনার অনুমিত বুলিয়ান ভেরিয়েবলটিতে সত্য হন (কী কারণে টাইপ ingালাই পাইথনে কাজ করে)। সুতরাং উভয় প্রকারের = স্পষ্টভাবে অসমর্থিত হওয়া উচিত (কিছু সতর্কতা, ত্রুটি ইত্যাদি প্রসারণ করা), অথবা এটি এমনভাবে কাজ করা উচিত যা দরকারী এবং স্বজ্ঞাতভাবে প্রত্যাশিত।
ডলফিন

14
@ ডলফিন - যথাক্রমে আমি একমত নই আমি মনে করি যে আচরণটি ঠিক সেইভাবে হওয়া উচিত এবং অজগরটির জেনের সাথে সামঞ্জস্যপূর্ণ "বিধিবিধিগুলি ভঙ্গ করার জন্য বিশেষ বিশেষ ক্ষেত্রগুলি যথেষ্ট বিশেষ নয়"। তবে আপনি যদি এ সম্পর্কে দৃ about়তার সাথে অনুভব করেন তবে কেন এটি বিভিন্ন অজগর মেলিং তালিকার একটিতে তুলে আনবেন না ? সেখানে, আপনি এমন কাউকে ক্ষমতা আছে বিশ্বাসী পাওয়ার একটি সুযোগ তৈরি থাকতে পারে না এই সমস্যা সম্পর্কে কিছু। এমনকি আপনি যদি আমাকে বোঝাতে সক্ষম হন তবে আপনি কেবল আমাকে বোঝাতে সক্ষম হয়েছিলেন এবং আমি এখনও দেব না বলে আচরণ এখনও বদলাবে না :)
মিলিলেসন

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
@ চর্লিপারপার add_argumentসাথে ডাকা হয়েছে dest='feature'set_defaultsসঙ্গে বলা হয় feature=True। বোঝা?
fnkr

4
এই বা মিগিলসনের উত্তরটি গ্রহণযোগ্য উত্তর হওয়া উচিত - যদিও ওপি চেয়েছিল --flag False, এসও উত্তরের একটি অংশ কেবল তারা কীভাবে সমাধানের চেষ্টা করছে না সে সম্পর্কে হওয়া উচিত। স্ট্রিংটিকে বুলিয়ান রূপান্তর করতে কিছু করার জন্য --flag Falseবা --other-flag Trueতারপরে কিছু কাস্টম পার্সার ব্যবহার করার দরকার নেই .. action='store_true'এবং action='store_false'বুলিয়ান পতাকা ব্যবহারের সর্বোত্তম উপায়
হ'ল

6
@ কমলিনেটর কেন "শেষ পর্যন্ত প্রশ্নগুলির উত্তর দেওয়ার বিষয়ে চূড়ান্তভাবে এসও? এর নিজস্ব গাইডলাইন অনুসারে , এমন কোনও প্রতিবেদন ... 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
বুল বা ননটাইপ জাতীয় জিনিসগুলির জন্য দয়া করে সাম্যতা অপারেটরটি কখনও ব্যবহার করবেন না । পরিবর্তে আপনার আইএস ব্যবহার করা উচিত
ওয়েবকঞ্জা

2
এটি স্বীকৃতের চেয়ে উত্তম উত্তর কারণ এটি অনর্থক বুলিয়ান স্ট্রিংয়ের পরিবর্তে বুলিয়ান মান নির্ধারণের জন্য পতাকাটির উপস্থিতি যাচাই করে। (হ্যাঁ দাও, আমি আপনাকে বুলেটিয়ানদের মতো শুনেছি ... তাই আমি আপনার বুলিয়ান সেট করতে আপনার বুলিয়ান দিয়েছিলাম!)
সিফন

4
হুম ... প্রশ্ন, যেমনটি বলা হয়েছে, কমান্ড লাইনে নিজেই "সত্য" / "মিথ্যা" ব্যবহার করতে চাইছে বলে মনে হচ্ছে; তবে এই উদাহরণটি সহ, python3 test.py --do-something Falseব্যর্থ হয় error: unrecognized arguments: False, সুতরাং এটি সত্যই প্রশ্নের উত্তর দেয় না।
sdbbs

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'])
আপনি বুয়

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()তার অর্থ এই নয় যে 'স্ট্রিংকে পার্স করুন'। পাইথন ডকুমেন্টেশন থেকে:

বুল (এক্স): মান সত্যের পরীক্ষার পদ্ধতি ব্যবহার করে একটি বুলিয়ানকে রূপান্তর করুন।

এর সাথে বৈসাদৃশ্য করুন

int (x): একটি সংখ্যা বা স্ট্রিং এক্সকে পূর্ণসংখ্যায় রূপান্তর করুন।


3
বা ব্যবহার করুন: parser.register ('টাইপ', 'bool', (ল্যাম্বদা এক্স: x. ফ্লোয়ার () ইন ("হ্যাঁ", "সত্য", "টি", "1")))
ম্যাটিস

17

আমি একই ইস্যুটি খুঁজছিলাম, এবং ইমো সুন্দর সমাধানটি হ'ল:

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

এবং এটি ব্যবহার করে উপরে উল্লিখিত অনুসারে বুলিয়ান স্ট্রিংকে বিশ্লেষণ করতে।


5
আপনি যদি এই রুটে যেতে যাচ্ছেন তবে আমি প্রস্তাব দিতে পারি distutils.util.strtobool(v)
সিভিফ্যান

1
distutils.util.strtoboolআয় 1 অথবা 0 নয় কোনো প্রকৃত বুলিয়ান।
সিএমসিডিগ্র্যাগনকাই

14

বেশ অনুরূপ উপায় ব্যবহার করা হয়:

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

এবং যদি আপনি আপনার আদেশে তর্ক - বৈশিষ্ট্যটি সেট করেন

 command --feature

আর্গুমেন্টটি সত্য হবে, আপনি যদি টাইপ না করে থাকেন - ফিচারটি আর্গুমেন্টের ডিফল্টটি সর্বদা মিথ্যা!


1
এই পদ্ধতিতে কি কিছু অসুবিধা রয়েছে যা অন্যান্য উত্তরগুলি পরাভূত করে? এটি এখন পর্যন্ত সবচেয়ে সহজ, সর্বাধিক সংবেদনশীল সমাধান যা ওপি (এবং এই ক্ষেত্রে আমি) যা চেয়েছিল তা পেয়ে যায়। আমি এটা ভালোবাসি.
সাইমন ও'হানলন

2
যদিও সহজ, এটি প্রশ্নের উত্তর দেয় না। ওপি এমন একটি যুক্তি চায় যেখানে আপনি নির্দিষ্ট করতে পারেন--feature False
আস্তারিউল

12

@ মিগিলসন যা বলেছিলেন তা ছাড়াও, এটিও লক্ষ করা উচিত যে এমন একটি 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'}
জেরি 101

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


এটি বেশ সুবিধাজনক বলে মনে হচ্ছে না। আমি লক্ষ্য করেছি যে আপনি টাইপ হিসাবে স্পষ্ট। আমি এই সম্পর্কে একটি প্রশ্ন ছিল: কিভাবে eval সংজ্ঞায়িত করা উচিত, বা এটি ব্যবহার করতে একটি আমদানি প্রয়োজন?
এডেজ

1
evalএকটি অন্তর্নির্মিত ফাংশন। docs.python.org/3/library/funitions.html#eval এটি কোনও আনরি ফাংশন হতে পারে যা অন্যান্য, আরও নমনীয় পদ্ধতির সুবিধা নেয়।
রাসেল

আরে, দুর্দান্ত। ধন্যবাদ!
এডেজ

1
এটি সুন্দর, তবে কেবল বন্যের মধ্যে রেখে দেওয়া বেশ ঝুঁকিপূর্ণ, যেখানে ব্যবহারকারীরা খারাপ হওয়ার বিষয়ে অবগত নয়, তারা কেবল তাদের স্ক্রিপ্টগুলিতে এটি কপি-পেস্ট করবে।
আর্নি

@ আরন, ভাল পয়েন্ট যদিও, এটি প্রতীয়মান হয়েছে যে কোনও সঠিক উদ্দেশ্যপ্রাপ্ত ব্যবহারকারীর জন্য দুর্ঘটনাক্রমে ক্ষতিকারক কিছু করা খুব কঠিন be
রাসেল

3

সবচেয়ে সহজ উপায় হ'ল পছন্দগুলি ব্যবহার করা :

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

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

- আমার-পতাকাটি মিথ্যাতে মূল্যায়ন করে না। প্রয়োজনীয় = true বিকল্প যদি আপনি সবসময় ব্যবহারকারী স্পষ্টভাবে একটি পছন্দ নির্দিষ্ট করতে চান যোগ করা যেতে পারে।



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

মনে রাখবেন যে সত্য মানগুলি হ্যাঁ, হ্যাঁ, টি, সত্য, অন এবং 1; ভ্যালু মানগুলি হ'ল এন, না, এফ, ভুয়া, অফ এবং 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.