Luận điểm tùy chọn vị trí tùy chọn?


652

Tôi có một kịch bản có nghĩa là được sử dụng như thế này: usage: installer.py dir [-h] [-v]

dir là một đối số vị trí được định nghĩa như thế này:

parser.add_argument('dir', default=os.getcwd())

Tôi muốn dirtùy chọn: khi không được chỉ định, nó sẽ chỉ là cwd.

Thật không may khi tôi không chỉ định dirđối số, tôi nhận được Error: Too few arguments.

Câu trả lời:


825

Sử dụng nargs='?'(hoặc nargs='*' nếu bạn sẽ cần nhiều hơn một thư mục)

parser.add_argument('dir', nargs='?', default=os.getcwd())

ví dụ mở rộng:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v

14
Có phải ?*có nghĩa giống như những gì chúng có nghĩa trong các biểu thức thông thường (nghĩa là ?yêu cầu 0 hoặc 1 và *yêu cầu 0 trở lên) không? Nếu vậy, làm +việc như là tốt?
Dolan Antenucci

37
@dolan: Vâng +, cũng vậy. Xem docs.python.org/2/l Library /argparse.html # nargs để biết chi tiết.
Vinay Sajip

2
Có một số cách để có được dir để hiển thị trong các đối số tùy chọn? hoặc có vẻ như các đối số vị trí nên có vòng loại 'tùy chọn'. Có thể đăng ký (khi có liên quan đến trợ giúp) như vậy không?
scagnetti

6
@ant Từ trên, bạn có thể thấy rằng dir là tùy chọn (nó xuất hiện trong dấu ngoặc vuông trong đầu ra argparse cho biết điều này).
Vinay Sajip

1
Tx! Truy cập dir từ options.dir, không args.dir, như tôi đã cố gắng!
ptim

69

Là một phần mở rộng cho câu trả lời @VinaySajip. Có thêm nargsgiá trị đề cập .

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N (một số nguyên). N đối số từ dòng lệnh sẽ được tập hợp lại thành một danh sách

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'. Tất cả các đối số dòng lệnh hiện được tập hợp thành một danh sách. Lưu ý rằng nhìn chung sẽ không có nhiều ý nghĩa khi có nhiều hơn một đối số vị trí với nargs='*', nhưng nargs='*'có thể có nhiều đối số tùy chọn .

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

'+'. Giống như '*', tất cả các đối số dòng lệnh có mặt được tập hợp thành một danh sách. Ngoài ra, một thông báo lỗi sẽ được tạo nếu không có ít nhất một đối số dòng lệnh.

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER. Tất cả các đối số dòng lệnh còn lại được tập hợp thành một danh sách. Điều này thường hữu ích cho các tiện ích dòng lệnh gửi đến các tiện ích dòng lệnh khác

Nếu nargsđối số từ khóa không được cung cấp, số lượng đối số tiêu thụ được xác định bởi hành động. Nói chung, điều này có nghĩa là một đối số dòng lệnh sẽ được sử dụng và một mục duy nhất (không phải là danh sách) sẽ được tạo ra.

Chỉnh sửa (được sao chép từ một nhận xét của @Acumenus) nargs='?' Các tài liệu nói: '?'. Một đối số sẽ được sử dụng từ dòng lệnh nếu có thể và được sản xuất dưới dạng một mục duy nhất. Nếu không có đối số dòng lệnh, giá trị từ mặc định sẽ được tạo ra.


3
Cần lưu ý tuy nhiên nargs='?'không tạo ra một danh sách.
Acumenus

@ABB Dòng cuối cùng của câu trả lời Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.Hy vọng điều này sẽ giúp ...
Matas Vaitkevicius

1
Dòng trích dẫn đề cập đến trường hợp không xác định nargs, nhưng nargs='?'đang xác định nó. Các tài liệu nói: '?'. Một đối số sẽ được sử dụng từ dòng lệnh nếu có thể và được sản xuất dưới dạng một mục duy nhất. Nếu không có đối số dòng lệnh, giá trị từ mặc định sẽ được tạo ra.
Acumenus

@ABB Chỉ cần chỉnh sửa câu trả lời nếu bạn cảm thấy thiếu thứ gì đó. Cảm ơn.
Matas Vaitkevicius

Sự khác biệt giữa nargs=argparse.REMAINDERnargs='*', dường như đối với tôi, chúng giống hệt nhau về hiệu ứng của chúng (được thử nghiệm trong Python 2.7.10 và Python 3.6.1)?

-5

parser.add_argumentcũng có một công tắc cần thiết . Bạn có thể sử dụng required=False. Đây là một đoạn mẫu với Python 2.7:

parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()

11
OP đã hỏi về thông số vị trí, không phải '--dir'. 'Bắt buộc' là một đối số không hợp lệ cho các vị trí. Và 'false' là một lỗi đánh máy, cô ấy có nghĩa là 'Sai'. +1 cho người mới, -1 cho sự chậm chạp.
SoloPilot
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.