argparse จัดเก็บเท็จหากไม่ระบุ


104
parser.add_argument('-auto', action='store_true')

ฉันจะจัดเก็บเท็จได้อย่างไรหาก-autoไม่ได้ระบุ? จำได้ลาง ๆ ว่าวิธีนี้มันไม่เก็บถ้าไม่ระบุ

คำตอบ:


171

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


2
สองสามความคิดเห็นเกี่ยวกับเรื่องนี้ ครั้งแรกก็ดูเหมือนว่าถ้าตัวเลือกที่เป็น-barแล้วdestจะถูกตั้งค่าโดยอัตโนมัติเพื่อให้barอยู่บนพื้นฐานของhg.python.org/cpython/rev/49677cc6d83a อย่างไรก็ตามฉันไม่เห็นว่าพฤติกรรมเริ่มต้นนี้ถูกตั้งค่าไว้ที่ใดในโค้ด ฉันมักจะตั้งdestข้อโต้แย้งอย่างชัดเจน นอกจากนี้ผมคิดว่าการปล่อยให้barค่าเริ่มต้นdestสำหรับ--barตัวเลือกไม่ได้จริงๆทำให้รู้สึกว่าเป็น--bar store_falseไม่ควรdestอยู่notbarในกรณีนี้?
Faheem Mitha

4
ฉันไม่เข้าใจหลักการตั้งชื่อที่ไม่ถูกต้อง
brainLoop

ฉันเห็นด้วยนี่เป็นเรื่องที่สับสนเล็กน้อย อย่างไรก็ตาม 'store_false' หรือ 'store_true' ถูกระบุเป็นการดำเนินการไม่ใช่ค่าเริ่มต้น ดังนั้นเมื่อคุณเพิ่มอาร์กิวเมนต์นี้ในโปรแกรมการดำเนินการที่ระบุจะถูกทริกเกอร์
ady

15

ด้วย

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)

วิ่ง

% test.py

ผลตอบแทน

Namespace(auto=False)

ดังนั้นดูเหมือนว่าจะจัดเก็บFalseโดยค่าเริ่มต้น


3

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

7
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')คุณสามารถตั้งค่านามแฝงปลายทางซึ่งจะปรับปรุงการอ่าน:
Krassi

-4

store_false จะดีฟอลต์เป็น0ค่าเริ่มต้น (คุณสามารถทดสอบเพื่อยืนยันได้) หากต้องการเปลี่ยนค่าเริ่มต้นเพียงเพิ่มdefault=Trueคำประกาศของคุณ

ดังนั้นในกรณีนี้: parser.add_argument('-auto', action='store_true', default=True)


ดูเหมือนจะไม่เป็นเช่นนั้นใน Python 2.7 และ 3.4: >>> 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)
Leynos

2
ขออภัยนั่นเป็นพฤติกรรมเริ่มต้นของ optparse argparse ควรตั้งค่าเริ่มต้นเป็นค่าผกผันของร้านค้า กล่าวคือค่าเริ่มต้น "store_false" เป็น "True"
Unix-Ninja
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.