Câu trả lời:
Các store_true
tùy chọn tự động tạo ra một giá trị mặc định của False .
Tương tự như vậy, store_false
sẽ mặc định là True khi đối số dòng lệnh không có.
Nguồn cho hành vi này ngắn gọn và rõ ràng: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861
Các tài liệu dành cho đối số không rõ ràng về chủ đề này, vì vậy tôi sẽ cập nhật chúng ngay bây giờ: http://hg.python.org/cpython/rev/49677cc6d83a
Raymond Hettinger đã trả lời câu hỏi của OP rồi.
Tuy nhiên, nhóm của tôi đã gặp sự cố về khả năng đọc khi sử dụng "store_false". Đặc biệt là khi thành viên mới tham gia nhóm của chúng tôi. Điều này là do cách nghĩ trực quan nhất là khi người dùng chỉ định một đối số, giá trị tương ứng với đối số đó sẽ là True hoặc 1.
Ví dụ: nếu mã là -
parser.add_argument('--stop_logging', action='store_false')
Trình đọc mã có thể mong đợi câu lệnh ghi nhật ký bị tắt khi giá trị trong stop_logging là true. Nhưng mã như sau sẽ dẫn đến ngược lại với hành vi mong muốn -
if not stop_logging:
#log
Mặt khác, nếu giao diện được định nghĩa như sau, thì "if-statement" sẽ hoạt động và dễ đọc trực quan hơn -
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 thực sự sẽ mặc định 0
theo mặc định (bạn có thể kiểm tra để xác minh). Để thay đổi những gì nó mặc định, chỉ cần thêm default=True
vào phần khai báo của bạn.
Vì vậy, trong trường hợp này:
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
, thì tùy chọn nàydest
sẽ tự động được đặt thànhbar
, dựa trên hg.python.org/cpython/rev/49677cc6d83a . Tuy nhiên, tôi không thấy hành vi mặc định này được đặt ở đâu trong mã. Tôi luôn đặtdest
đối số một cách rõ ràng. Ngoài ra, tôi nghĩ rằng đểbar
mặc địnhdest
cho--bar
tùy chọn không thực sự có ý nghĩa nếu--bar
làstore_false
. Nên khôngdest
thểnotbar
trong trường hợp này?