การแยกค่าบูลีนด้วย argparse


614

ฉันต้องการใช้ argparse เพื่อวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งบูลีนที่เขียนเป็น "--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("")evalutates Falseไป

ฉันจะได้รับ argparse การแยก"False", "F"และกรณีที่ต่ำกว่าของพวกเขาจะเป็นสายพันธุ์False?


40
นี่คือความหมายหนึ่งซับของ@ parser.add_argument('--feature', dest='feature', default=False, action='store_true')คำตอบของ การแก้ปัญหานี้จะรับประกันคุณเคยได้รับboolชนิดที่มีค่าหรือTrue False(โซลูชันนี้มีข้อ จำกัด : ตัวเลือกของคุณจะต้องมีค่าเริ่มต้น)
Trevor Boyd Smith

7
นี่คือความหมายหนึ่งซับของ@ parser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))คำตอบแม็กซิม เมื่อเลือกที่จะใช้ในการแก้ปัญหานี้จะช่วยให้มั่นใจboolประเภทมีมูลค่าหรือTrue เมื่อเลือกที่จะไม่ใช้คุณจะได้รับFalse None( distutils.util.strtobool(x)มาจากคำถาม stackoverflow อื่น )
Trevor Boyd Smith

8
วิธีการเกี่ยวกับสิ่งที่ต้องการparser.add_argument('--my_bool', action='store_true', default=False)
AruniRC

คำตอบ:


275

อีกวิธีหนึ่งที่ใช้คำแนะนำก่อนหน้า แต่มีข้อผิดพลาดในการแยกวิเคราะห์ "ถูกต้อง" จาก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>

และยังคงใช้ค่าเริ่มต้น (เฉพาะการตั้งค่าผู้ใช้) ข้อเสียอย่างหนึ่งที่เกี่ยวข้อง (โดยทางอ้อม) ด้วยวิธีการนั้นคือ 'nargs' อาจเป็นข้อโต้แย้งตำแหน่ง - ดูคำถามที่เกี่ยวข้องและรายงานข้อผิดพลาดของอาร์กิวเมนต์นี้


4
nargs = '' หมายถึงศูนย์หรืออาร์กิวเมนต์เดียว docs.python.org/3/library/argparse.html#nargs
Maxim

1
ฉันชอบสิ่งนี้ แต่ค่าเริ่มต้นที่เทียบเท่าของฉัน = NICE ให้ข้อผิดพลาดแก่ฉันดังนั้นฉันต้องทำอย่างอื่น
Michael Mathews

2
@MarcelloRomani str2bool ไม่ได้เป็นประเภทในความรู้สึกของหลามมันเป็นฟังก์ชั่นที่กำหนดไว้ข้างต้นคุณจะต้องรวมไว้ที่ไหนสักแห่ง
Maxim

4
รหัสของจะถูกแทนที่ด้วยstr2bool(v) bool(distutils.util.strtobool(v))ที่มา: stackoverflow.com/a/18472142/2436175
อันโตนิโอ

4
อาจเป็นเรื่องที่ควรค่าแก่การกล่าวถึงด้วยวิธีนี้คุณไม่สามารถตรวจสอบได้ว่าอาร์กิวเมนต์ถูกตั้งค่าด้วยเหตุผลหรือไม่ถ้าอาร์กิวเมนต์ตั้งค่าif args.nice:เป็นเท็จจะไม่มีวันผ่านเงื่อนไข ถ้าเป็นแบบนี้ถูกต้องแล้วบางทีมันอาจจะดีกว่าที่จะกลับรายการจากstr2boolฟังก์ชั่นและการตั้งค่ารายการเป็นconstพารามิเตอร์เช่นนี้,[True] [False]แก้ไขให้ถูกต้องหากฉันผิด
NutCracker

887

ฉันคิดว่าวิธีที่น่าเชื่อถือมากกว่านี้คือ:

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]ก็ตาม แต่คุณก็จบด้วยทั้ง "เท็จ" และ "จริง" ซึ่งถือว่าเป็นจริง (เนื่องจากการส่งจากสตริงไปยังบูล?) อาจเกี่ยวข้องกับปัญหา
dolphin

41
ใช่ฉันแค่คิดว่าไม่มีเหตุผลสำหรับสิ่งนี้ไม่ทำงานตามที่คาดไว้ และนี่เป็นสิ่งที่ทำให้เข้าใจผิดอย่างยิ่งเนื่องจากไม่มีการตรวจสอบความปลอดภัยหรือข้อความแสดงข้อผิดพลาด
โลมา

69
@mgilson - สิ่งที่ฉันพบว่าทำให้เข้าใจผิดคือคุณสามารถตั้งค่า type = bool คุณไม่ได้รับข้อความแสดงข้อผิดพลาดและสำหรับอาร์กิวเมนต์สตริงทั้ง "เท็จ" และ "จริง" คุณจะได้รับ True ในตัวแปรบูลีนที่คาดคะเน การหล่อประเภททำงานในหลาม) ดังนั้น type = bool ควรได้รับการสนับสนุนอย่างชัดเจน (ปล่อยคำเตือนข้อผิดพลาดและอื่น ๆ ) หรือควรทำงานในลักษณะที่มีประโยชน์และคาดหวังอย่างสังหรณ์ใจ
ปลาโลมา

14
@ ดอลฟิน - ตามลำดับฉันไม่เห็นด้วย ฉันคิดว่าพฤติกรรมเป็นวิธีที่ควรจะเป็นและสอดคล้องกับเซนของหลาม "กรณีพิเศษไม่พิเศษพอที่จะทำลายกฎ" อย่างไรก็ตามถ้าคุณรู้สึกถึงสิ่งนี้อย่างมากทำไมไม่ลองนำเสนอในรายการจดหมายหลามแบบใดแบบหนึ่ง ที่นั่นคุณอาจมีโอกาสโน้มน้าวใจคนที่มีอำนาจทำอะไรบางอย่างเกี่ยวกับปัญหานี้ แม้ว่าคุณจะมีความสามารถที่จะโน้มน้าวให้ฉันคุณจะได้ประสบความสำเร็จในการโน้มน้าวเพียงฉันและพฤติกรรมที่จะยังคงไม่เปลี่ยนแปลงตั้งแต่ฉันไม่ได้เป็น dev :)
mgilson

15
เรากำลังโต้เถียงเกี่ยวกับสิ่งที่bool()ฟังก์ชั่นPython ควรทำหรือสิ่งที่ควรยอมรับโต้เถียงtype=fn? argparseตรวจสอบทั้งหมดที่fncallable มันคาดว่าfnจะใช้อาร์กิวเมนต์สตริงหนึ่งและส่งกลับค่า ลักษณะการทำงานของเป็นความรับผิดชอบของโปรแกรมเมอร์ที่ไม่fn argparse's
hpaulj

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_defaultsfeature=True
fnkr

4
คำตอบของ mgilson นี้ควรเป็นคำตอบที่ยอมรับแม้ว่า OP ต้องการ--flag Falseแต่ส่วนหนึ่งของคำตอบ SO ควรเกี่ยวกับสิ่งที่พวกเขากำลังพยายามแก้ไขไม่ใช่แค่วิธีการ ไม่ควรมีเหตุผลอย่างแน่นอนที่จะทำ--flag Falseหรือ--other-flag Trueใช้ parser ที่กำหนดเองเพื่อแปลงสตริงเป็นบูลีน .. action='store_true'และaction='store_false'เป็นวิธีที่ดีที่สุดในการใช้แฟล็กบูลีน
kevlarr

6
@cowlinator เหตุใดในที่สุดจึงตอบ "คำถามตามที่ระบุ" ตามแนวทางของมันเอง anwer ... can be “don’t do that”, but it should also include “try this instead”ซึ่ง (อย่างน้อยสำหรับฉัน) แสดงถึงคำตอบควรจะลึกซึ้งยิ่งขึ้นเมื่อเหมาะสม มีบางครั้งที่เราบางคนโพสต์คำถามจะได้รับประโยชน์จากแนวทางที่ดี / ดีที่สุด ฯลฯ ตอบ "ตามที่ระบุ" มักจะไม่ทำอย่างนั้น ดังที่ได้กล่าวไปแล้วความคับข้องใจของคุณที่มีต่อคำตอบมักจะถือว่ามากเกินไป
kevlarr

2
หากต้องการมีค่าที่สามเมื่อผู้ใช้ไม่ได้ระบุคุณสมบัติอย่างชัดเจนเขาจำเป็นต้องแทนที่บรรทัดสุดท้ายด้วยparser.set_defaults(feature=None)
Alex Che

2
หากเราต้องการเพิ่มhelp=รายการสำหรับอาร์กิวเมนต์นี้ควรไปที่ไหน ในการadd_mutually_exclusive_group()โทร? ในหนึ่งหรือทั้งสองadd_argument()สาย? ที่อื่น?
Ken Williams

57

นี่คือรูปแบบอื่นที่ไม่มีแถว / s พิเศษเพื่อตั้งค่าเริ่มต้น บูลมีค่าที่กำหนดไว้เสมอเพื่อให้สามารถใช้ในงบโลจิคัลได้โดยไม่ต้องตรวจสอบล่วงหน้า

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มิฉะนั้นคุณจะได้รับอาร์กิวเมนต์ที่แท้จริงเสมอ
Garren S

1
กรุณาอย่าใช้ตัวดำเนินการความเท่าเทียมกันในสิ่งที่ต้องการบูลหรือ nonetype คุณควรใช้IS แทน
webKnjaZ

2
นี่เป็นคำตอบที่ดีกว่าคำตอบที่ยอมรับได้เพราะมันจะตรวจสอบการมีอยู่ของแฟล็กเพื่อตั้งค่าบูลีนแทนที่จะต้องการสตริงบูลีนที่ซ้ำซ้อน (Yo dawg ฉันได้ยินมาว่าคุณชอบบูลีน ... ดังนั้นฉันจึงให้บูลีนกับบูลีนของคุณเพื่อตั้งค่าบูลีนของคุณ!)
Siphon

4
อืม ... คำถามตามที่กล่าวมาดูเหมือนว่าต้องการใช้ "True" / "False" บนบรรทัดคำสั่งเอง อย่างไรก็ตามด้วยตัวอย่างนี้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
ดีสำหรับแฟน ๆ ของ oneliner และมันก็สามารถปรับปรุงได้อีกเล็กน้อย: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เช่น `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ใช้ค่าฟังก์ชั่นและระดับ มีตัวอย่าง stackoverflow มากมายในการกำหนดค่าที่กำหนดเองสำหรับทั้งสอง


ในกรณีที่ไม่ชัดเจนจากการสนทนาก่อนหน้านี้bool()ไม่ได้หมายความว่า 'แยกสตริง' จากเอกสาร Python:

bool (x): แปลงค่าเป็น Boolean โดยใช้ขั้นตอนการทดสอบความจริงมาตรฐาน

ตัดกับนี่ด้วย

int (x): แปลงตัวเลขหรือสตริง x เป็นจำนวนเต็ม


3
หรือใช้: parser.register ('type', 'bool', (lambda x: x.lower () ใน ("ใช่", "จริง", "t", "1"))
Matyas

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
มีข้อเสียเปรียบกับวิธีนี้หรือไม่ที่คำตอบอื่นเอาชนะ? นี่ดูเหมือนจะเป็นวิธีที่ง่ายและง่ายที่สุดในการแก้ไขปัญหาที่ OP ต้องการ (และในกรณีนี้ฉัน) ต้องการ ฉันรักมัน.
Simon O'Hanlon

2
ในขณะที่เรียบง่าย แต่ไม่ตอบคำถาม OP ต้องการอาร์กิวเมนต์ที่คุณสามารถระบุได้--feature False
Astariul


12

สิ่งนี้ใช้ได้กับทุกสิ่งที่ฉันคาดไว้:

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

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 ฉันมีคำถามเกี่ยวกับสิ่งนี้: การกำหนด Eval ควรกำหนดอย่างไรหรือจำเป็นต้องมีการนำเข้าเพื่อใช้ประโยชน์จากมันหรือไม่?
edesz

1
evalเป็นฟังก์ชั่นในตัว docs.python.org/3/library/functions.html#evalนี่อาจเป็นฟังก์ชั่นใด ๆ ที่แตกต่างจากที่อื่นวิธีการที่ยืดหยุ่นกว่านี้ใช้ประโยชน์
รัสเซล

เฮ้มันเยี่ยมมาก ขอบคุณ!
edesz

2
มันน่ารัก แต่ค่อนข้างเสี่ยงที่จะพูดถึงเรื่องป่าเถื่อนซึ่งผู้ใช้ที่ไม่ได้ตระหนักถึงความชั่วร้ายนั้นจะคัดลอกมาไว้ในสคริปต์ของพวกเขา
Arne

@ Arne จุดดี แม้ว่าจะดูเหมือนว่ามันจะค่อนข้างยากสำหรับผู้ใช้ที่เจตนาดีที่จะทำสิ่งที่เป็นอันตรายโดยไม่ตั้งใจ
รัสเซล

3

วิธีที่ง่ายที่สุดคือใช้ตัวเลือก :

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

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

ไม่ผ่าน - my-flag จะประเมินเป็น False ต้อง = Trueตัวเลือกที่อาจจะเพิ่มถ้าคุณต้องการให้ผู้ใช้ระบุอย่างชัดเจนทางเลือก


2

ฉันคิดว่าวิธีที่ยอมรับมากที่สุดคือ:

parser.add_argument('--ensure', nargs='*', default=None)

ENSURE = config.ensure is None

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, true, on และ 1; ค่าเท็จคือ n, no, f, false, off และ 0 เพิ่ม ValueError ถ้า val เป็นอย่างอื่น


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

คล้ายกับ @Akash แต่นี่เป็นอีกวิธีที่ฉันใช้ มันใช้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

เพื่อเป็นการปรับปรุงคำตอบของ @Akash Desarda คุณสามารถทำได้

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.