Python argparse: giá trị mặc định hoặc giá trị được chỉ định


174

Tôi muốn có một đối số tùy chọn sẽ mặc định thành giá trị nếu chỉ có cờ không có giá trị được chỉ định, nhưng lưu trữ giá trị do người dùng chỉ định thay vì mặc định nếu người dùng chỉ định giá trị. Đã có một hành động có sẵn cho việc này?

Một ví dụ:

python script.py --example
# args.example would equal a default value of 1
python script.py --example 2
# args.example would equal a default value of 2

Tôi có thể tạo một hành động, nhưng muốn xem liệu đã có cách nào để thực hiện việc này chưa.

Câu trả lời:


272
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--example', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)

% test.py 
Namespace(example=None)
% test.py --example
Namespace(example=1)
% test.py --example 2
Namespace(example=2)

  • nargs='?' có nghĩa là đối số 0 hoặc 1
  • const=1 đặt mặc định khi có 0 đối số
  • type=int chuyển đổi đối số thành int

Nếu bạn muốn test.pyđặt examplethành 1 ngay cả khi không có --examplechỉ định, thì bao gồm default=1. Đó là, với

parser.add_argument('--example', nargs='?', const=1, type=int, default=1)

sau đó

% test.py 
Namespace(example=1)

Làm thế nào để làm điều này với chuỗi? Tôi có một vấn đề nan giải với sự khác biệt của "" (chuỗi trống là mặc định) và "" (chuỗi trống như được nhập bởi người dùng). Trong mã bây giờ tôi đang sử dụng mặc định và vì tôi cần phải thực hiện một số thao tác, tôi có một cái gì đó như thế này self.foo = (args.bar or some_else_source).upper(). Nó sẽ phá vỡ không có đối tượng AFAIUC.
0andriy

16

Trên thực tế, bạn chỉ cần sử dụng defaultđối số add_argumentnhư trong test.pykịch bản này :

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('--example', default=1)
    args = parser.parse_args()
    print(args.example)

test.py --example
% 1
test.py --example 2
% 2

Chi tiết tại đây .


7

Sự khác biệt giữa:

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1, default=7)

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1)

là như vậy:

myscript.py => gỡ lỗi là 7 (từ mặc định) trong trường hợp đầu tiên và "Không" trong lần thứ hai

myscript.py --debug => gỡ lỗi là 1 trong mỗi trường hợp

myscript.py --debug 2 => gỡ lỗi là 2 trong mỗi trường hợp

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.