parser.add_argument('-auto', action='store_true')
ฉันจะจัดเก็บเท็จได้อย่างไรหาก-auto
ไม่ได้ระบุ? จำได้ลาง ๆ ว่าวิธีนี้มันไม่เก็บถ้าไม่ระบุ
parser.add_argument('-auto', action='store_true')
ฉันจะจัดเก็บเท็จได้อย่างไรหาก-auto
ไม่ได้ระบุ? จำได้ลาง ๆ ว่าวิธีนี้มันไม่เก็บถ้าไม่ระบุ
คำตอบ:
store_true
ตัวเลือกที่จะสร้างค่าเริ่มต้นโดยอัตโนมัติเท็จ
ในทำนองเดียวกันstore_false
ค่าเริ่มต้นจะเป็นTrueเมื่อไม่มีอาร์กิวเมนต์บรรทัดคำสั่ง
แหล่งที่มาของพฤติกรรมนี้สั้นและชัดเจน: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861
เอกสาร Argparse ไม่ชัดเจนในเรื่องนี้ดังนั้นฉันจะอัปเดตทันที: http://hg.python.org/cpython/rev/49677cc6d83a
ด้วย
import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)
วิ่ง
% test.py
ผลตอบแทน
Namespace(auto=False)
ดังนั้นดูเหมือนว่าจะจัดเก็บFalse
โดยค่าเริ่มต้น
Raymond Hettinger ตอบคำถามของ OP แล้ว
อย่างไรก็ตามกลุ่มของฉันประสบปัญหาด้านความสามารถในการอ่านโดยใช้ "store_false" โดยเฉพาะอย่างยิ่งเมื่อสมาชิกใหม่เข้าร่วมกลุ่มของเรา เนื่องจากเป็นวิธีที่ง่ายที่สุดในการคิดคือเมื่อผู้ใช้ระบุอาร์กิวเมนต์ค่าที่สอดคล้องกับอาร์กิวเมนต์นั้นจะเป็น True หรือ 1
ตัวอย่างเช่นถ้ารหัสคือ -
parser.add_argument('--stop_logging', action='store_false')
โปรแกรมอ่านโค้ดอาจคาดหวังว่าคำสั่งการบันทึกจะปิดเมื่อค่าใน stop_logging เป็นจริง แต่รหัสดังต่อไปนี้จะนำไปสู่สิ่งที่ตรงกันข้ามกับพฤติกรรมที่ต้องการ -
if not stop_logging:
#log
ในทางกลับกันหากอินเทอร์เฟซถูกกำหนดไว้ดังต่อไปนี้ "if-statement" จะทำงานและอ่านง่ายกว่า -
parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
#log
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')
คุณสามารถตั้งค่านามแฝงปลายทางซึ่งจะปรับปรุงการอ่าน:
store_false จะดีฟอลต์เป็น0
ค่าเริ่มต้น (คุณสามารถทดสอบเพื่อยืนยันได้) หากต้องการเปลี่ยนค่าเริ่มต้นเพียงเพิ่มdefault=True
คำประกาศของคุณ
ดังนั้นในกรณีนี้:
parser.add_argument('-auto', action='store_true', default=True)
>>> parser.add_argument('--bar', action='store_false')
_StoreFalseAction(option_strings=['--bar'], dest='bar', nargs=0, const=False, default=True, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args([])
Namespace(bar=True)
-bar
แล้วdest
จะถูกตั้งค่าโดยอัตโนมัติเพื่อให้bar
อยู่บนพื้นฐานของhg.python.org/cpython/rev/49677cc6d83a อย่างไรก็ตามฉันไม่เห็นว่าพฤติกรรมเริ่มต้นนี้ถูกตั้งค่าไว้ที่ใดในโค้ด ฉันมักจะตั้งdest
ข้อโต้แย้งอย่างชัดเจน นอกจากนี้ผมคิดว่าการปล่อยให้bar
ค่าเริ่มต้นdest
สำหรับ--bar
ตัวเลือกไม่ได้จริงๆทำให้รู้สึกว่าเป็น--bar
store_false
ไม่ควรdest
อยู่notbar
ในกรณีนี้?