Argparse lưu trữ sai nếu không xác định


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

Làm thế nào tôi có thể lưu trữ sai nếu -autolà không xác định? Tôi lờ mờ nhớ rằng theo cách này, nó lưu trữ Không nếu không xác định

Câu trả lời:


171

Các store_truetù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_falsesẽ 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


2
Một vài nhận xét về điều này. Đầu tiên, có vẻ như nếu là tùy chọn -bar, thì tùy chọn này destsẽ tự động được đặt thành bar, 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 đặt destđối số một cách rõ ràng. Ngoài ra, tôi nghĩ rằng để barmặc định destcho --bartùy chọn không thực sự có ý nghĩa nếu --barstore_false. Nên không destthể notbartrong trường hợp này?
Faheem Mitha

4
Tôi không hiểu quy ước đặt tên tương phản.
brainLoop,

Tôi đồng ý, điều này là một chút khó hiểu. Dù sao, 'store_false' hoặc 'store_true' được chỉ định là hành động và không phải là giá trị mặc định. Do đó, khi bạn thêm đối số này vào chương trình, hành động được chỉ định sẽ được kích hoạt.
ady

15

Với

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

đang chạy

% test.py

hoa lợi

Namespace(auto=False)

Vì vậy, nó dường như được lưu trữ Falsetheo mặc định.


3

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

7
Bạn có thể đặt bí danh đích, mà sẽ cải thiện khả năng đọc: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi

-4

store_false thực sự sẽ mặc định 0theo 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=Truevà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)


Điều này không có vẻ như là trường hợp trong Python 2.7 và 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
xin lỗi, đó thực sự là hành vi mặc định của optparse. argparse nên mặc định là nghịch đảo của store. tức là, 'store_false' mặc định là 'True'.
Unix-Ninja,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.