Argumen argumen posisi opsional?

652

Saya memiliki skrip yang dimaksudkan untuk digunakan seperti ini: usage: installer.py dir [-h] [-v]

dir adalah argumen posisi yang didefinisikan seperti ini:

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

Saya ingin dirmenjadi opsional: ketika tidak ditentukan itu seharusnya cwd.

Sayangnya ketika saya tidak menentukan dirargumennya, saya mengerti Error: Too few arguments.

Waldo Bronchart
sumber

Jawaban:

825

Gunakan nargs='?'(atau nargs='*' jika Anda akan membutuhkan lebih dari satu dir)

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

contoh luas:

>>> 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
Vinay Sajip
sumber
14
Apakah maksud ?dan *hal yang sama yang mereka maksudkan dalam ekspresi reguler (yaitu ?membutuhkan 0 atau 1, dan *membutuhkan 0 atau lebih)? Jika demikian, apakah +berhasil juga?
Dolan Antenucci
37
@dolan: Ya, +bekerja juga. Lihat docs.python.org/2/library/argparse.html#nargs untuk detailnya.
Vinay Sajip
2
apakah ada cara untuk mendapatkan dir agar muncul dalam argumen opsional? atau tampaknya argumen posisi harus memiliki kualifikasi 'opsional' sebelumnya. apakah mungkin untuk mendaftar (sejauh menyangkut bantuan) seperti itu?
scagnetti
6
@ atau Dari yang di atas, Anda dapat melihat bahwa dir adalah opsional (yang ditampilkan dalam kurung siku dalam output argparse menunjukkan ini).
Vinay Sajip
1
Tx! Akses dir dari options.dir, tidak args.dir, saat saya mencoba!
ptim
69

Sebagai ekstensi untuk jawaban @VinaySajip. Ada tambahan yang nargslayak disebut .

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

N (bilangan bulat). N argumen dari baris perintah akan dikumpulkan bersama menjadi daftar

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

'*'. Semua argumen baris perintah yang ada dikumpulkan ke dalam daftar. Perhatikan bahwa pada umumnya tidak masuk akal untuk memiliki lebih dari satu argumen posisi nargs='*', tetapi beberapa argumen opsional dengan nargs='*'dimungkinkan.

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

'+'. Sama seperti '*', semua argumen baris perintah yang ada dikumpulkan ke dalam daftar. Selain itu, pesan kesalahan akan dihasilkan jika tidak ada setidaknya satu argumen baris perintah.

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

argparse.REMAINDER. Semua argumen baris perintah yang tersisa dikumpulkan ke dalam daftar. Ini biasanya berguna untuk utilitas baris perintah yang mengirim ke utilitas baris perintah lainnya

Jika nargsargumen kata kunci tidak disediakan, jumlah argumen yang dikonsumsi ditentukan oleh tindakan. Secara umum ini berarti argumen baris perintah tunggal akan dikonsumsi dan satu item (bukan daftar) akan diproduksi.

Edit (disalin dari komentar oleh @Acumenus) nargs='?' Dokumen mengatakan: '?'. Satu argumen akan dikonsumsi dari baris perintah jika memungkinkan dan diproduksi sebagai satu item. Jika tidak ada argumen baris perintah, nilai dari default akan dihasilkan.

Matas Vaitkevicius
sumber
3
Namun perlu dicatat bahwa nargs='?'itu tidak menghasilkan daftar.
Acumenus
@ABB Baris terakhir dari jawaban Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.Semoga ini bisa membantu ...
Matas Vaitkevicius
1
Baris yang dikutip merujuk pada kasus tidak mendefinisikan nargs, tetapi nargs='?'mendefinisikannya. The docs mengatakan: '?'. Satu argumen akan dikonsumsi dari baris perintah jika memungkinkan, dan diproduksi sebagai satu item. Jika tidak ada argumen baris perintah, nilai dari default akan dihasilkan.
Acumenus
@ABB Edit saja jawabannya jika Anda merasa ada yang kurang. Terima kasih.
Matas Vaitkevicius
Apa perbedaan antara nargs=argparse.REMAINDERdan nargs='*', menurut saya, keduanya identik dalam pengaruhnya (diuji dengan Python 2.7.10 dan Python 3.6.1)?
-5

parser.add_argumentjuga memiliki saklar yang diperlukan . Anda bisa menggunakannya required=False. Berikut ini cuplikan sampel dengan 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()
rakhee
sumber
11
OP bertanya tentang posisi params, bukan '--dir'. 'wajib' adalah argumen yang tidak valid untuk posisi. Dan 'salah' adalah salah ketik, maksudnya 'Salah'. +1 untuk pemula, -1 untuk kecerobohan.
SoloPilot