ฉันต้องการใช้ 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
?
parser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))
คำตอบแม็กซิม เมื่อเลือกที่จะใช้ในการแก้ปัญหานี้จะช่วยให้มั่นใจbool
ประเภทมีมูลค่าหรือTrue
เมื่อเลือกที่จะไม่ใช้คุณจะได้รับFalse
None
( distutils.util.strtobool(x)
มาจากคำถาม stackoverflow อื่น )
parser.add_argument('--my_bool', action='store_true', default=False)
parser.add_argument('--feature', dest='feature', default=False, action='store_true')
คำตอบของ การแก้ปัญหานี้จะรับประกันคุณเคยได้รับbool
ชนิดที่มีค่าหรือTrue
False
(โซลูชันนี้มีข้อ จำกัด : ตัวเลือกของคุณจะต้องมีค่าเริ่มต้น)